0

Я пытаюсь создать единую форму, которая создает подразделение в больнице, и вы можете выбрать shift_types, которые применяются к этому модулю в таблице UnitShiftTypes. У меня есть has_many и: через UnitShiftTypes между Units и ShiftTypes. Кажется, что он каждый раз бросает ошибку. Я не могу понять этого. Любая помощь будет принята с благодарностью!Невозможно назначить защищенные атрибуты: shift_type_ids, unit_shift_type

_form.html.erb

<%= simple_form_for(@unit) do |f| %> 
    <%= f.error_notification %> 
    <div class="form-inputs"> 
    <%= f.input :name %> 
    <%= f.input :number %> 
    <%= f.fields_for :unit_shift_type do |ff| %> 
     <%= f.select :shift_type_ids, ShiftType.all.collect {|x| [x.name, x.id, ]}, {}, :multiple => true %> 
     <%= ff.hidden_field :user_id, :value => current_user %> 
    <% end %> 
    <%= f.input :hospital_id %> 
    </div> 
    <div class="form-actions"> 
    <%= f.button :submit %> 
    </div> 
<% end %> 

unit.rb

class Unit < ActiveRecord::Base 
belongs_to :hospital 
has_many :unit_users, :dependent => :restrict 
has_many :unit_shift_types 
has_many :users, :through => :unit_users, :dependent => :restrict 
has_many :shift_types, :through => :unit_shift_types 

attr_accessible :hospital_id, :name, :number, :unit_id, :unit_shift_types_attributes 
accepts_nested_attributes_for :unit_shift_types 

validates_presence_of :hospital_id, :name, :number 
validates_uniqueness_of :number, :scope => :hospital_id, :message => "is already associated with this Hospital." 
end 

unit_shift_type.rb

class UnitShiftType < ActiveRecord::Base 
belongs_to :shift_type 
belongs_to :unit 

attr_accessible :shift_type_id, :unit_id 

validates_presence_of :shift_type_id, :unit_id 
validates_uniqueness_of :shift_type_id, :scope => :unit_id, :message => "is already associated with this Unit." 
end 

shift_type.rb

class ShiftType < ActiveRecord::Base 
has_many :unit_shift_types 

attr_accessible :created_by_id, :enabled, :end_time, :name, :start_time 
validates_presence_of :start_time, :end_time, :name, :created_by_id 

end 

units_controller.rb

# POST /units 
# POST /units.json 
def create 
    @unit = Unit.new(params[:unit]) 

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

# PUT /units/1 
# PUT /units/1.json 
def update 
    @unit = Unit.find(params[:id]) 

    respond_to do |format| 
    if @unit.update_attributes(params[:unit]) 
     format.html { redirect_to @unit, notice: 'Unit was successfully updated.' } 
     format.json { head :no_content } 
    else 
     format.html { render action: "edit" } 
     format.json { render json: @unit.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Запрос параметров:

{"utf8"=>"✓", "authenticity_token"=>"CnIZCDbEVNr/B8fby2La8ibvtQtjycwO/BD0mQ2sOw4=", "unit"=>{"name"=>"1", "number"=>"1", "shift_type_ids"=>["", "1"], "unit_shift_type"=>{"user_id"=>""}, "hospital_id"=>"1"}, "commit"=>"Create Unit", "action"=>"create", "controller"=>"units"} 

ответ

-1

попробуйте заменить:

<%= f.select :shift_type_ids, ShiftType.all.collect {|x| [x.name, x.id, ]}, {}, :multiple => true %> 

с:

<%= f.select :shift_type_ids, @unit.unit_shift_types.collect {|x| [x.name, x.id, ]}, {}, :multiple => true %> 

Но чтобы получить реальное решение, мы» я должен видеть тебя r для создания и/или обновления. Как вы добавляете shift_type к единице?

Это должно выглядеть примерно так:

@unit << shift_type 
+0

Я обновил свой вопрос с помощью контроллера # create и #update. Проблема с предоставленным вами решением заключается в том, что я пытаюсь захватить ранее созданные ShiftTypes и связать их с Unit. Я действительно не сохраняю идентификатор в единицах. У меня будет запись UnitShiftType, созданная для каждого выбранного элемента. Поэтому, если они выбрали Day, Night ShiftTypes. У них будет 2 записи в UnitShiftType, которые связывают с Unit #. – EricC

0

Если вы просто хотите добавить существующие shift_types при создании нового блока, и вы используете shift_type_ids, то вам не нужно указывать вложенные атрибуты. В любом случае, вы используете объект формы для создания select, поэтому нет необходимости хранить fields_for блок. Хотя вы используете fields_for для создания скрытого поля user_id, я не вижу, где у вас есть атрибут user_id в модели UnitShiftType.

Так замените fields_for блок

<%= f.fields_for :unit_shift_type do |ff| %> 
    <%= f.select :shift_type_ids, ShiftType.all.collect {|x| [x.name, x.id, ]}, {}, :multiple => true %> 
    <%= ff.hidden_field :user_id, :value => current_user %> 
<% end %> 

с

<%= f.select :shift_type_ids, ShiftType.all.collect {|x| [x.name, x.id]}, {}, :multiple => true %> 

И добавить к shift_type_idsUnit модели attr_accessible.

Смежные вопросы