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.