1

うまく作成できるテーブルのリストがあります。次に、親の[編集]をクリックして(edit.html.erbに移動)、[新しい子]をクリックして、子テーブルを作成できるようにします。親テーブルと子テーブルの関係はhas_and_belongs_to_manyです。

<%= button_to 'New Child', new_parent_child_path([@parent, @parent.children.build]), :method => :get %>

これは新しい子フォームへのリンクであり、次のエラーが発生します。

'undefined method `children' for nil:NilClass'

サーバーログから次のことがわかります。

Started GET "/parents/1//children/new" for blah at blah
Processing by ChildrenController#new as HTML
  Parameters: {"parent_id"=>"1"}
  Rendered children/_form.html.erb (1.3ms)
  Rendered children/new.html.erb within layouts/application (1.9ms)
Completed 500 Internal Server Error in 4ms

ActionView::Template::Error (undefined method `children' for nil:NilClass):
    1: <%= form_for ([@parent, @parent.children.build]) do |f| %>
    2: 
    3: <div class = "field">
    4:   <%= f.label :Child_name %><br/>
  app/views/children      /_form.html.erb:1:in`_app_views_children__form_html_erb__2140243687_70034946643120'
  app/views/children/new.html.erb:3:in `_app_views_children_new_html_erb__655166082_70034947829100'

子new.html.erbでレンダリングされる_form.html.erbは次のとおりです。

<%= form_for ([@parent, @parent.children.build]) do |f| %>

<div class = "field">
  <%= f.label :Child_name %><br/>
  <%= f.text_field :ChildName %>
</div>

<div class = "field">
  <%= f.label :Child_email_address %><br/>
  <%= f.text_field :ChildEmail %>
</div>

<div class = "actions">
  <%= f.submit %>
</div>
<% end %>

(注:テーブルは実際には親子とは呼ばれていません。秘密のためにこれらの名前を使用しました。また、has_manyを使用するようにアドバイスしないでください。興味はありません。)

編集#1:「ChildrenController」からのコード

  def new
    @child = Child.new
  end

  def create
    @parent = Parent.find(params [:parent_id])
    @scout = @parent.children.build(params[:child])
    redirect_to parent_path(@parent)
  end
4

1 に答える 1

0

@parent = Parent.find(params[:parent_id])new.html.erb テンプレートで使用しているため、新しいアクションに含める必要があります。それ以外の場合は nil になり、機能し@parent.children.buildません。

于 2012-09-26T23:40:20.010 に答える