在自联接关联中查找用户提供的id的子项

时间:2014-10-18 19:28:51

标签: ruby ruby-on-rails-4

我有一个正常运作的自我加入关系,其中指南有很多孩子,属于父母。我需要让用户通过html表单提供ID,然后找到它的子节点或其父节点(当然是单独的形式)当我在rails控制台中运行时

@guidelines = Guideline.find(4)
@guidelines.children

我得到了适当的孩子,当我做的时候

@guideline.parent

我得到了合适的父母。

出于某种原因,我将表单定义为

<%= form_tag(guidelines_path, :method => "get", id: "search-form") do %>
  <td><%= label_tag(:seeChildren, "See Immediate Children")%></td>
  <td><%= text_field_tag :seeChildren, params[:seeChildren], placeholder: "Enter ID" %></td>
  <td><%= submit_tag "Search", :name => nil %></td>
<% end %>

(应用程序/视图/ index.html.erb)

在控制器中我说

if params[:seeChildren]
      @guideline = Guideline.find(params[:seeChildren])
      @guideline.children

(应用程序/控制器/ guidelines_controller.rb)

我在终端服务的rails中遇到以下错误:

    Started GET "/guidelines?utf8=%E2%9C%93&seeChildren=4" for 127.0.0.1 at 2014-10-18 14:25:58 -0500
Processing by GuidelinesController#index as HTML
  Parameters: {"utf8"=>"✓", "seeChildren"=>"4"}
  Guideline Load (0.3ms)  SELECT  "guidelines".* FROM "guidelines"  WHERE "guidelines"."id" = ? LIMIT 1  [["id", 4]]
  Rendered guidelines/index.html.erb within layouts/application (4.1ms)
Completed 500 Internal Server Error in 85ms

ActionView::Template::Error (undefined method `each' for nil:NilClass):
    62:     <th>Guideline Text</th>
    63:   </tr>
    64: 
    65:   <% @guidelines.each do |guideline| %>
    66:     <tr>
    67:       <td><%= guideline.id %></td>
    68:       <td><%= guideline.guide_desc %></td>
  app/views/guidelines/index.html.erb:65:in `_app_views_guidelines_index_html_erb__3376611479089996349_70360485758280'


  Rendered /Users/john.dodson/.rvm/gems/ruby-2.1.3@global/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (1.7ms)
  Rendered /Users/john.dodson/.rvm/gems/ruby-2.1.3@global/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.3ms)
  Rendered /Users/john.dodson/.rvm/gems/ruby-2.1.3@global/gems/actionpack-4.1.6/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout (21.6ms)

有什么想法吗?我很感激帮助。我发布了几个问题并且通常因为我没有提供足够的信息而失败,所以如果你需要查看另一个文件,请告诉我。

3 个答案:

答案 0 :(得分:0)

您可能忘记在控制器中定义@guidlines,这可以解释为什么在尝试在 @上呼叫undefined method 'each' for nil:NilClass时收到.each错误消息的原因<% @guidelines.each do |guideline| %>

中的指南

答案 1 :(得分:0)

是的,和JBMILGROm说的一样,你忘记在控制器中提到@guidelines。

答案 2 :(得分:0)

除了在指南上使用错误的单数/复数外,我发现我需要将一个对象转换为数组。因此,找到一个指南,然后调用子项并将结果转换为数组。所以在控制器中我说:

if params[:seeChildren]
      @guideline = Guideline.find(params[:seeChildren])
      @guidelines = Array.wrap(@guideline.children())

和魔术,我的查询有效。将此发布在此处,以便其他有类似问题的人可以找到真相。