0

入れ子になったフォームの to-many リレーションにフィールドを追加する機能を追加したい Rails フォームがあります。私はこのような形をしています。

= form_for @company do |f|
  = f.label :name, "Company name"
  = f.text_field :name
  = f.label :homepage_url, "Company website"
  = f.text_field :homepage_url, placeholder: "www.mycompanywebsite.com"
  = render "domains_form"
  %div{class: "add_more_button"}
    = link_to "Add more domains", "add_domain", remote: true, data: {mini: "true", theme: "b", iconpos: "left", icon: "plus",  role: "button"}, id:"more_email_domains"
  = f.submit "Continue", data: {theme: "a", icon: "arrow-r", iconpos: "right"}

部分的な「domain_form」は次のようになります。

= fields_for @company do |f|
  = f.fields_for :domains do |d|
    = d.label :identifier, "Domain name"
    = d.text_field :identifier

これにより、次のようなエラーが表示されます。

undefined method `[]' for nil:NilClass
Extracted source (around line #2):

1: %div
2:   = fields_for @company do |f|

部分的に @company インスタンスを見つけることができなかったようですが、どうしてでしょうか? メイン テンプレートにはインスタンスへのアクセス権があるため、部分テンプレートにもインスタンスへのアクセス権があるべきではありません。会社のインスタンスをロケールとして排他的に渡す必要がありますか?

グローバルメソッドとして使用するのではなく、 form_builder オブジェクトで使用していないため、 fields_for 呼び出しで問題が発生する可能性が高くなります。Rails api は、メソッドをスタンドアロンhttp://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_formで使用できることを示唆しているため、最初の fields_for が親オブジェクトを受け取り、次のフィールドが取得します子供、これは私の仮定ではうまくいくはずです。これで私を助けてくれませんか。

ありがとう

4

1 に答える 1

0

Haml 構文の書き方はわかりませんが、to-many 関連付けをループしようとしましたか?

# _form.html.erb
<%= @company.domains.each do |domain| %>
  <%= render "domain_form", domain: domain %>
<% end %>

# _domain_form.html.erb
<%= fields_for "company[domains_attributes][], domain do |d| %>
  <%= d.label :identifier, "Domain name" %>
  <%= d.text_field :identifier %>
<% end %>

# company.rb
attr_accessible ..., :domains_attributes
has_many :domains
accepts_nested_attributes_for :domains

これが役立つことを願っています。

于 2013-06-05T14:54:21.623 に答える