在RoR中使用嵌套属性时查找特定数据库条目

时间:2015-05-04 16:14:05

标签: ruby-on-rails ruby nested-attributes

我在Ruby on Rails应用程序(4.0.2)中使用嵌套属性,以便调查has_many问题并接受_nested_attributes_for问题和问题belongs_to survey。

我遇到的问题是,当我只想查看属于特定调查的问题时,我会得到一个未定义的方法" id"为nil:NilClass" -error。另一方面,当我查看索引操作无问题的所有问题时。

我的问题控制器索引操作:

  def index
     @questions = Question.where(:survey_id => @survey.id).all # if instead I use @questions = Question.all it works fine, but is not what I want.
     #@questions = @survey.questions.all
     @surveys = Survey.all
     @survey = Survey.first
 end

我的survey / index.html.erb页面:

  <%= link_to("questions", { :controller => 'questions', :survey_id => survey.id }, :class => 'btn btn-xs') do %>
        <%= glyph 'th-list' %>
  <%- end -%>

我的问题模型:

 class Question < ActiveRecord::Base
   belongs_to :survey
   scope :sorted, lambda { order("questions.created_at ASC")}
 end

我还使用了一个我称之为find_survey的before_action,如下所示:

def find_survey
  # If in each action calling this method (find_survey) has :survey_id sent
  if params[:survey_id]
    # We will then go to the database and look for (and find) :survey_id and set that to @survey. 
    @survey = Survey.find(params[:survey_id])
  end
end

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

NilClass上的未定义方法是因为您的实例变量@survey为零,当您调用Question.where(:survey_id => @survey.id).all时,您会收到该错误。

如果您的关联设置正确,您应该能够@survey.questions运行,而不必在Questions上执行搜索。这部分是ActiveRecord rails magic。你应该打电话给@survey.questions.all,因为这会返回问题课的所有内容,不管怎样,你应该好好去。

至于为什么现在这不适合你,它可能只是一个订单 - 你在下面这一行定义之前调用了@survey

答案 1 :(得分:0)

根据您发布的错误,此行中的@survey可能为nil

@questions = Question.where(:survey_id => @survey.id).all

所以也许你的&#34; before_action&#34;没被叫?