Ruby on rails RAILS 4-如何在索引视图中显示名称而不是ID?
我是新手。 我希望我的问题/视图/索引显示与问题关联的语言的名称,而不是语言id 我的问题是:Ruby on rails RAILS 4-如何在索引视图中显示名称而不是ID?,ruby-on-rails,Ruby On Rails,我是新手。 我希望我的问题/视图/索引显示与问题关联的语言的名称,而不是语言id 我的问题是: class Question < ActiveRecord::Base validates :phrase, presence: true has_many :answers, dependent: :delete_all belongs_to :language end class CreateQuestions < ActiveRecord::Migration de
class Question < ActiveRecord::Base
validates :phrase, presence: true
has_many :answers, dependent: :delete_all
belongs_to :language
end
class CreateQuestions < ActiveRecord::Migration
def change
create_table :questions do |t|
t.string :phrase
t.string :language
t.timestamps
end
end
end
class AddLanguageIdToQuestions < ActiveRecord::Migration
def change
add_column :questions, :language_id, :integer
end
end
class Language < ActiveRecord::Base
end
class CreateLanguages < ActiveRecord::Migration
def change
create_table :languages do |t|
t.string :name
t.timestamps
end
end
end
在问题/_form.html.erb中:
<p>
<%= f.label :language_id %><br>
<%= f.select :language_id, @languages.map { |l| [l.name, l.id] }, {:prompt => 'select language'} %>
</p>
<% @questions.each do |question| %>
<li>"<%= link_to question.phrase, question %>" in <%= question.language.name %>?%></li>
<% end %>
“选择语言”}%>
在questions/view/index.html.erb中:
<p>
<%= f.label :language_id %><br>
<%= f.select :language_id, @languages.map { |l| [l.name, l.id] }, {:prompt => 'select language'} %>
</p>
<% @questions.each do |question| %>
<li>"<%= link_to question.phrase, question %>" in <%= question.language.name %>?%></li>
<% end %>
”“在哪?%>
尽管我尝试了“question.language.name”(在show视图中工作得很好)的几个变体,但我一直遇到的错误是索引视图中的“undefined method”language_id
非常感谢您的帮助。只需将索引操作更改为:
def index
@questions = Question.all.includes(:language)
end
编辑
<% @questions.each do |question| %>
<% unless question.language.nil? %>
<li>"<%= link_to question.phrase, question %>" in <%= question.language.name %>?%></li> <% end %>
<% end %>
为了避免这种情况:更好的解决方案是使用包含
这听起来像是ActiveRecord关联的工作,特别是:
ActiveRecord关联基本上使用数据库中的a来提取关系数据并附加到对象。目前,您只关注使用单个对象,没有任何关联数据
--
您的问题可以通过以下方法解决:
#app/models/question.rb
Class Question < ActiveRecord::Base
belongs_to :language
end
#app/models/language.rb
Class Language < ActiveRecord::Base
has_many :questions
end
@questions.language\u id
不正确,因为您试图从数组中检索单个id。即Question.all
返回一个数组。此外,language.find
需要单个id参数来返回单个语言
使用Language.find(@questions.Language\u id)
返回的确切内容是什么?一个包含问题的语言数组
此外,在何处,HTML.Erb部分被调用?默认情况下,Rails框架将调用新的编辑操作中的部分,因此,如果您试图为窗体部分中的SELECT字段设置<代码>语言> /代码>,那么您将不会在索引操作中使用它。/p> 我已经删除了我的答案。请解释你的解决方案,以便OP了解问题所在。我没有正确阅读你的答案。糟糕的是,我以为你只解决了n+1问题。当我尝试此解决方案时,我得到了一个未定义的方法“name”,表示nil:NilClass错误,指的是index.html.erb中的question.language.name。就是这样!是我吗问题是由数据库中的一些问题引起的,这些问题是在开发过程的早期输入的,没有记录相关语言?(即使现在验证了相关语言的存在?)是的。有两个原因。第一个原因是你提到的控制器,第二个原因是你在评论中提到的删除这一行
@language=language.find(@questions.language\u id)索引中的
操作。这是错误和无用的。你还必须在你的语言
模型中包含关联
。如果是一对多
,那么有多个:问题
或者如果是一对一
那么有一个:问题
。问题之间有n:1关联s和语言(一个问题只有一种语言,但一种语言可能属于多个问题)。在您的回答中,这是相反的,我认为这不是bkong28想要的。Sven是对的-一个问题有一种语言,但一种语言可能属于多个问题。更新以反映这一点!我正在尝试查找(并在索引中显示)创建问题时在表单中选择的语言。显示语言id没有问题,但我希望它显示语言。表单部分在“编辑”和“新建”视图中调用。我考虑过使用“集合选择”,但选择了更简单的“选择”,因为我认为前者太过简单。在这种情况下如果您不需要在控制器中设置'@language'。当您循环查看视图中的每个问题时,如果问题有语言,@G.B的答案是正确的,则只需将问题设为'question.language.name'。而不是除非问题.language.nil?
#app/models/question.rb
Class Question < ActiveRecord::Base
belongs_to :language
end
#app/models/language.rb
Class Language < ActiveRecord::Base
has_many :questions
end
#app/controllers/questions_controller.rb
Class QuestionsController < ApplicationController
def index
@questions = Question.all
end
end
#app/views/questions/index.html.erb
<% @questions.each do |question| %>
<%= question.language.name %>
<% end %>
#app/models/question.rb
Class Question < ActiveRecord::Base
belongs_to :language
delegate :name, to: :language, prefix: true #-> @question.language_name
end