在整个应用程序中放置在许多页面上的嵌套表单

时间:2010-02-15 16:25:10

标签: ruby-on-rails nested-forms

我有一个带有嵌套属性的表单,我需要将它放在许多不同的页面上。不一定是它所属的模型。 所以我在营营业页面上有这个表格。用户信息创建得很好,但用户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年2月14日22:15:16的127.0.0.1)[POST]   参数:{“user”=&gt; {“name”=&gt;“Chirs”,“roles”=&gt; {“name”=&gt;“营”“},”company_id“=&gt;”nil“,”位置“=&gt;”营指挥官“,”电子邮件“=&gt;”slkdfj@dlkfj.com“,”battalion_id“=&gt;”1“},”提交“=&gt;”注册“,”动作“=&gt; “create”,“authenticity_token”=&gt;“PcGbsQNG7wKKPDZTM + JGry / a1aBWZuoyaCNwlqlCJ0g =”,“controller”=&gt;“users”}

我只是不会触发角色的创建操作。

看起来这应该非常简单,我唯一的猜测就是让它远离用户模型创建问题。它应该是form_for @battalions,然后使用嵌套和角色嵌套,这是三个级别,似乎不正确。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在处理accepts_nested_attributes_for时,您需要分配给“#{association} _attributes”。在您的情况下,您需要roles_attributes。

fields_for与accepts_nested_attributes_for一起使用时,应生成正确的HTML。

您的观看次数/部分内容似乎是正确的,但您的隐藏字段未生成正确的输入ID。

我能够重现你的问题的唯一方法是@user是零。在使用此表单之前,您是否有可能忘记初始化用户。在多个页面上使用相同的部分时,忽略这一点并不困难。

确保在呈现此表单的所有控制器操作中执行@user = User.new。