1

我正在尝试使用 nested_form gem 创建一个下拉列表,该下拉列表将显示链及其位置的列表。当用户单击提交按钮时,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

看起来您正在simple_form与默认的 Rails 表单助手混合并获得一些奇怪的行为。我没有使用过simple_form,但我的猜测是您可以通过更改为 来解决您的f.fields_for问题f.simple_fields_for

这是一个可能有帮助的例子。

于 2013-04-23T20:12:10.327 回答