1

nested_form ジェムを使用して、チェーンとその場所のリストを表示するドロップダウンを作成しようとしています。ユーザーが送信ボタンをクリックすると、nested_form は users_locations というジョイナー テーブルに新しいエントリを作成する必要があります。ただし、フォームは次のようにエラーを吐き出します。

User locations user can't be blank

つまり、user_id が NULL であるため、テーブルにエントリを作成できないという不平を言っています (user_id は user_locations テーブルの必須フィールドであるため)。

_form.html.erb (ユーザー ビュー フォルダー内)

  <div class="field" id="location_toggle">
    <%= f.label "Location:", :class => "form_labels", required: true %>
    <%= f.fields_for :user_locations do |location| %>
       <%= location.grouped_collection_select :location_id, Chain.all, :locations, :name, :id, :name, include_blank: false %>
    <% end %>
    <%= f.link_to_add "Add a Location", :user_locations, :class => "btn btn-primary btn-small" %>
    <br/>
  </div>

user.rb (モデル)

belongs_to :chain
has_many :user_locations
has_many :locations, :through => :user_locations
...
accepts_nested_attributes_for :user_locations, :reject_if => :all_blank, :allow_destroy => true
validates_associated :user_locations, :message => ": you have duplicate entries."
...
attr_accessible :first_name, :last_name, ... , :user_locations_attributes 

users_controller.rb

def create
    @user = User.new(params[:user])
    @user.save ? (redirect_to users_path, notice: 'User was successfully created.') : (render action: "new")
  end

ログには次のように表示されます:

SELECT 1 AS one FROM "user_locations" WHERE ("user_locations"."user_id" IS NULL AND "user_locations"."location_id" = 1)
4

2 に答える 2

2

私はあなたがuser_location validates :user_id, presence: true何かだと思いますよね?

私は最近、この質問に答えてこれを見ました。ネストされたモデルを作成するとき、作成されるすべてのオブジェクトの検証は、それらのいずれかが保存される前に実行されるようですuser_id。保存されている場合、検証時にそれを持つことはできません。

これを回避するには、作成時の検証を無効にすることができます。たとえば、次のようにします。

# user_locations.rb
validates :user_id, presence: true, on: :update
于 2013-04-23T23:40:22.750 に答える
0

デフォルトの Rails フォーム ヘルパーとブレンドsimple_formして奇妙な動作をしているようです。で作業したことはありませんが、に変更するsimple_formことで問題を解決できると思います。f.fields_forf.simple_fields_for

役立つ例を次に示します。

于 2013-04-23T20:12:10.327 に答える