RoR:带有设计的嵌套表单

时间:2012-11-28 16:30:36

标签: ruby-on-rails forms devise nested profiles

我是RoR的新手,我想我可以请你帮忙。我找不到我要找的具体答案。

我想使用Devise进行模型化问题。 Devise设置了一个成员模型,我希望有一个SuperMember模型,它具有比Member更多的属性,以及一些不同的视图。

我想设置一个嵌套表单来创建一个SuperMember,同时在后台自动创建一个会员帐号。

Member.rb(由设计生成)

class Member < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

SuperMember.rb

class Supermember < ActiveRecord::Base
  attr_accessible :first_name, :last_name
  belongs_to :member, :dependent => :destroy
  accepts_nested_attributes_for :member
end

Supermembers.controllers.rb

def new
@supermember = Supermember.new
  @supermember.member = Supermember.build

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @supermember }
  end
end

def create
  @supermember = Supermember.new(params[:supermember])

  respond_to do |format|
  if @supermember.save
    format.html { redirect_to @supermember, notice: 'Supermember was successfully created.' }
    format.json { render json: @supermember, status: :created, location: @supermember }
  else
    format.html { render action: "new" }
    format.json { render json: @supermember.errors, status: :unprocessable_entity }
  end
end

我尝试创建一个嵌套表单,以便生成成员和超级成员:

<%= simple_form_for(@supermember) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :first_name %>
    <%= f.input :last_name %>
  </div>

    <% # Devise member %>
    <%= f.fields_for :member do |m| %>
  <div class="form-inputs">
    <%= m.input :email, :required => true, :autofocus => true %>
    <%= m.input :password, :required => true %>
    <%= m.input :password_confirmation, :required => true %>
  </div>
    <% end %>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

问题是,当我提交此表单时,收到以下错误消息:

Can't mass-assign protected attributes: member_attributes

Application Trace | Framework Trace | Full Trace
  app/controllers/supermembers.rb:44:in `new'
  app/controllers/supermembers.rb:44:in `create'

我真的不明白如何修复它。你能帮我这个吗? 非常感谢你!

2 个答案:

答案 0 :(得分:2)

您需要允许超级成员接受成员属性的质量分配

class Supermember < ActiveRecord::Base
  attr_accessible :first_name, :last_name, :member_attributes
  ...
end

答案 1 :(得分:0)

如果你要做的是向成员添加属性,那么这样做是完全可以的。没有必要只为此目的创建一个超级成员(当然,如果你有其他议程,那么继续......)。

如果您向模型添加属性,设备并不在意,即使它是由模型生成的。