0

ネストされた属性を持つフォームがあり、さまざまなページに配置する必要があります。必ずしもそれが属するモデルではありません。だから私は大隊のショーページにこのフォームを持っています。ユーザー情報は問題なく作成されますが、ユーザーhas_manyロールとこれらの属性は作成されていません。私は他にもうまく機能するネストされたフォームをたくさん持っていますが、これを機能させるために何が欠けているのか完全には理解できません。

class User < ActiveRecord::Base  
  has_many :roles   
  accepts_nested_attributes_for :roles, :allow_destroy => true

      def active?
  active
end

def activate!(params)
  self.active = 1
  self.login = params[:user][:login]
  self.password = params[:user][:password]
  self.password_confirmation = params[:user][:password_confirmation]
  save
end

def deliver_activation_instructions!
    reset_perishable_token!
    NotifierMailer.deliver_activation_instructions(self)
end

def deliver_activation_confirmation!
    reset_perishable_token!
    NotifierMailer.deliver_activation_confirmation(self)
end

def has_no_credentials?
    self.crypted_password.blank?
end

def signup!(params)
    self.login = params[:user][:login]
    self.email = params[:user][:email]
    self.name = params[:user][:name]
    self.position = params[:user][:position]
    self.battalion_id = params[:user][:battalion_id]
    self.company_id = params[:user][:company_id]
    self.platoon_id = params[:user][:platoon_id]

    save_without_session_maintenance
end
end 

class Role < ActiveRecord::Base  
  belongs_to :user  
end  


<% form_for :user, @user, :url => users_path do |f| %>
        <%= f.error_messages %>
      <% f.fields_for :roles do |f| %>
        <%= render :partial => "role", :locals => { :f => f, :role => 'battalion'} %>
      <% end %>
        <%= render :partial => "form", :locals => { :f => f, :position => 'Battalion Commander', :company => 'nil'} %>
      <%= f.submit "Register" %>
    <% end %>

_role.html.erb

<%= f.hidden_field(:name, :value => role) %>

_form.html.erb

<%= f.hidden_field(:position, :value => position) %>
<%= f.hidden_field(:battalion_id, :value => @battalion.id) %>
<%= f.hidden_field(:company_id, :value => company) %>

<%= f.label(:name, "Name:") %>
<%= f.text_field :name%>
<br />
<%= f.label(:email, "E-Mail:") %>
<%= f.text_field :email%>
<br />

これは、ユーザーを作成したときに発生することです。

UsersController#createの処理(2010-02-14 22:15:16の127.0.0.1の場合)[POST]パラメーター:{"user" => {"name" => "Chirs"、 "roles" => {"name "=>" battalion "}、" company_id "=>" nil "、" position "=>" Battalion Commander "、" email "=>" slkdfj@dlkfj.com "、" battalion_id "=>" 1 "}、 "commit" => "Register"、 "action" => "create"、 "authenticity_token" => "PcGbsQNG7wKKPDZTM + JGry / a1aBWZuoyaCNwlqlCJ0g ="、 "controller" => "users"}

ロールの作成アクションをトリガーしません。

これは非常に単純なはずです。私の唯一の推測は、ユーザーモデルから離れることで問題が発生することです。form_for @battalionsにしてから、ユーザーをネストし、ロールをネストする必要があります。これは3つのレベルであり、正しくないように見えます。

どんな助けでも大歓迎です。

4

1 に答える 1

0

accept_nested_attributes_for を扱うときは、「#{association}_attributes」に割り当てる必要があります。あなたの場合、roles_attributesが必要です。

fields_for を accept_nested_attributes_for と組み合わせて使用​​すると、正しい HTML が生成されます。

ビュー/パーシャルは正しいように見えますが、隠しフィールドが正しい入力 ID を生成していません。

問題を再現できる唯一の方法は、@user が nil の場合です。このフォームを使用する前にユーザーを初期化するのを忘れている可能性はありますか? 複数のページで同じパーシャルを使用する場合、見逃すのは難しいことではありません。

このフォームをレンダリングするすべてのコントローラー アクションで @user = User.new を実行してください。

于 2010-02-15T19:29:04.377 に答える