0

病院でユニットを作成する単一のフォームを作成しようとしています。UnitShiftTypes テーブルでそのユニットに適用される shift_types を選択できます。Units と ShiftTypes の間に has_many と :through UnitShiftTypes があります。毎回エラーになるようです。私はこれを理解できないようです。どんな助けでも大歓迎です!

_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"}
4

2 に答える 2

0

新しいユニットの作成中に既存の shift_types を追加するだけで、shift_type_ids を使用している場合は、ネストされた属性を指定する必要はありません。とにかく、フォーム オブジェクトを使用して を作成しているため、ブロックselectを保持する必要はありません。fields_forを使用しfields_forて隠しフィールドを作成していますが、モデルのどこに属性user_idがあるかわかりません。user_idUnitShiftType

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_idsします。Unitattr_accessible

于 2013-02-12T22:04:53.317 に答える
-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 %>

ただし、実際の解決策を得るには、コントローラーの作成および/または更新アクションを確認する必要があります。ユニットにshift_typeをどのように追加しますか?

次のようになります。

@unit << shift_type
于 2013-02-12T16:17:50.237 に答える