2012-11-28 1 views
1

Je suis nouveau à RoR et j'ai pensé que je pourrais vous demander de l'aide. Je n'ai pas trouvé la réponse spécifique que je cherche.RoR: Formes imbriquées avec plan

J'ai un problème avec une modélisation que je veux faire en utilisant Devise. Devise met en place un modèle de membre, et je souhaite avoir un modèle SuperMember ayant plus d'attributs que Member, et des vues différentes.

Je souhaite configurer un formulaire imbriqué pour créer un SuperMembre, tout en créant automatiquement le compte Membre en arrière-plan.

Member.rb (généré par legs)

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 

I essayé de créer une forme imbriquée dans l'ordre pour générer à la fois le membre et le supermember:

<%= 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 %> 

Le problème est que lorsque je soumets ce formulaire, je reçois le message d'erreur suivant:

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' 

Je ne comprends vraiment pas comment y remédier. Pourriez-vous m'aider sur celui-ci? Merci beaucoup!

+0

Bienvenue chez SO. Vous n'avez pas besoin de mettre à jour le titre lorsque vous choisissez une réponse, il suffit de marquer la réponse - http://meta.stackexchange.com/a/5235/181382 – mguymon

Répondre

2

Vous devez permettre Supermember d'accepter l'affectation masse de l'attributs

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

Merci beaucoup! Vous avez ma solution ;-) –

0

Si ce que vous essayez de faire est d'ajouter des attributs à un membre, il est tout à fait correct de le faire. Il n'est pas nécessaire de créer un supermembre à cette fin seulement (bien sûr, si vous avez d'autres objectifs, alors allez-y ...).

Le périphérique ne se soucie pas si vous ajoutez des attributs au modèle, même s'il a été généré par celui-ci.