Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RAILS 4-如何在索引视图中显示名称而不是ID?_Ruby On Rails - Fatal编程技术网

Ruby on rails RAILS 4-如何在索引视图中显示名称而不是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

我是新手。 我希望我的问题/视图/索引显示与问题关联的语言的名称,而不是语言id

我的问题是:

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