relaciones recursos rails modelos formularios anidados many-to-many nested-attributes ruby-on-rails-4

many to many - recursos - Muchos a muchos atributos anidados en Rails 4(con parámetros potentes)



recursos anidados rails (2)

He estado tratando de resolver esto por unos días. Estoy utilizando Rails 4 (con la técnica de asignación de masa actualizada) y estoy intentando usar atributos anidados con una relación de muchos a muchos. Mi registro está guardando en la base de datos pero todo es nulo y obtengo un error de "Parámetros no permitidos: escuela, alumnos, prospectos" en mis registros.

Esto es lo que tengo:

referral.rb

class Referral < ActiveRecord::Base belongs_to :school belongs_to :alumni belongs_to :prospect end

alumni.rb

class Alumni < ActiveRecord::Base has_many :referrals has_many :prospects, through: :referrals accepts_nested_attributes_for :referrals end

school.rb

class School < ActiveRecord::Base has_many :referrals has_many :prospects, through: :referrals has_many :alumnis, through: :referrals accepts_nested_attributes_for :referrals end

perspectiva.rb

class Prospect < ActiveRecord::Base has_many :referrals has_many :alumnis, through: :referrals accepts_nested_attributes_for :referrals end

referrals_controller.rb

def create @referral = Referral.create(referral_params) respond_to do |format| if @referral.save # ReferralMailer.referrer_email(@referral).deliver # ReferralMailer.referral_email(@referral).deliver format.html { redirect_to @referral, notice: ''Referral was successfully created.'' } format.json { render action: ''show'', status: :created, location: @referral } else format.html { render action: ''new'' } format.json { render json: @referral.errors, status: :unprocessable_entity } end end end private # Use callbacks to share common setup or constraints between actions. def set_referral @referral = Referral.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def referral_params params.require(:referral).permit(prospects_attributes: [:first_name, :last_name, :email], alumnis_attributes: [:first_name, :last_name, :email], schools_attributes: [:name]) end

_form.html.erb

<%= form_for(@referral) do |f| %> <% if @referral.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(@referral.errors.count, "error") %> prohibited this referral from being saved:</h2> <ul> <% @referral.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <%= f.fields_for :school do |builder| %> <%= builder.label :name, "School Name" %> <%= builder.text_field :name %> <% end %> <%= f.fields_for :alumnis do |builder| %> <%= builder.label :first_name, "First Name" %> <%= builder.text_field :first_name %> <%= builder.label :last_name, "Last Name" %> <%= builder.text_field :last_name %> <%= builder.label :email, "Email" %> <%= builder.text_field :email %> <% end %> <%= f.fields_for :prospects do |builder| %> <%= builder.label :first_name, "First Name" %> <%= builder.text_field :first_name %> <%= builder.label :last_name, "Last Name" %> <%= builder.text_field :last_name %> <%= builder.label :email, "Email" %> <%= builder.text_field :email %> <% end %> <div class="actions"> <%= f.submit %> </div> <% end %>

salida de registro del servidor

Processing by ReferralsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"Ee+rREUU/0wGzNFTEaMxr8oRStaA53X9fmDrlVRyrD8=", "referral"=>{"school"=>{"name"=>"asdf"}, "alumnis"=>{"first_name"=>"asdf", "last_name"=>"asfd", "email"=>"asdf"}, "prospects"=>{"first_name"=>"asdf", "last_name"=>"asdf", "email"=>"asdf"}}, "commit"=>"Create Referral"} Unpermitted parameters: school, alumnis, prospects (0.1ms) begin transaction SQL (0.5ms) INSERT INTO "referrals" ("created_at", "updated_at") VALUES (?, ?) [["created_at", Fri, 12 Jul 2013 03:49:06 UTC +00:00], ["updated_at", Fri, 12 Jul 2013 03:49:06 UTC +00:00]] (0.6ms) commit transaction (0.1ms) begin transaction (0.1ms) commit transaction Redirected to http://localhost:3000/referrals/68

Registro de referencia

=> #<Referral id: 68, created_at: "2013-07-12 03:49:06", updated_at: "2013-07-12 03:49:06", school_id: nil, alumni_id: nil, prospect_id: nil>


También debe pasar ''id'' en cada uno de los parámetros de modelo anidados:

def referral_params params.require(:referral).permit(prospects_attributes: [:id,:first_name, :last_name, :email], alumnis_attributes: [:id,:first_name, :last_name, :email], schools_attributes: [:id,:name]) end

Tener swing

Aclamaciones


Sus parámetros no están siendo pasados ​​al controlador como lo esperan los parámetros fuertes.

De tu registro del servidor:

"referral" => { "school" => { "name" => "asdf" }, "alumnis" => { "first_name" => "asdf", "last_name" => "asfd", "email" => "asdf" }, "prospects" => { "first_name" => "asdf", "last_name" => "asdf", "email" => "asdf" } }

Parámetros fuertes esperan alumnis_attributes , alumnis_attributes y schools_attributes por lo que los schools_attributes prospects y la school se bloquean y los objetos se crean sin ningún atributo.