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 (for 127.0.0.1 at 2010-02-14 22:15:16) [POST] 参数:{"user"=>{"name"=>"Chirs", "roles"=>{"name "=>"battalion"}, "company_id"=>"nil", "position"=>"营长", "email"=>"slkdfj@dlkfj.com", "battalion_id"=>"1"}, "commit"=>"Register", "action"=>"create", "authenticity_token"=>"PcGbsQNG7wKKPDZTM+JGry/a1aBWZuoyaCNwlqlCJ0g=", "controller"=>"users"}

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

看起来这应该很简单,我唯一的猜测是让它远离用户模型会造成问题。是否应该是 form_for @battalions 然后将用户嵌套和角色嵌套,这是三个级别,看起来不正确。

任何帮助将不胜感激。

4

1 回答 1

0

在处理 Accepts_nested_attributes_for 时,您需要分配给“#{association}_attributes”。在您的情况下,您需要角色属性。

fields_for 与 accept_nested_attributes_for 结合使用时应该生成正确的 HTML。

您的视图/部分似乎是正确的,但您的隐藏字段未生成正确的输入 ID。

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

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

于 2010-02-15T19:29:04.377 回答