Ruby on rails 轨道:嵌套的\u表单\u用于<;列>;can';不要空白

Ruby on rails 轨道:嵌套的\u表单\u用于<;列>;can';不要空白,ruby-on-rails,ruby,rubygems,Ruby On Rails,Ruby,Rubygems,我试图使用嵌套的表单gem创建一个下拉列表,显示链及其位置的列表。当用户单击submit按钮时,嵌套的_表单应该在名为users_locations的joiner表中创建一个新条目。但是,表单会显示一个错误,如下所示: User locations user can't be blank 换句话说,它抱怨user_id为NULL,因此无法在表中创建条目(因为user_id是user_locations表中的必填字段) _form.html.erb(在用户视图文件夹中) 用户\u control

我试图使用嵌套的表单gem创建一个下拉列表,显示链及其位置的列表。当用户单击submit按钮时,嵌套的_表单应该在名为users_locations的joiner表中创建一个新条目。但是,表单会显示一个错误,如下所示:

User locations user can't be blank
换句话说,它抱怨user_id为NULL,因此无法在表中创建条目(因为user_id是user_locations表中的必填字段)

_form.html.erb(在用户视图文件夹中)

用户\u 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)

看起来您正在将
simple\u form
与默认的Rails表单帮助程序混合,并获得一些奇怪的行为。我没有使用过
simple\u form
,但我猜您可以通过将
f.fields\u for
更改为
f.simple\u fields\u for
来解决问题


这里有一个可能有用的方法。

我假设您是
用户位置
验证:用户id,状态:true
或其他什么,对吗

我最近对此进行了研究,以回应,似乎在创建嵌套模型时,要创建的所有对象的验证都是在保存任何对象之前运行的,因此,即使您的模型在保存时设置了
user\u id
,在验证时也无法设置它

要解决此问题,您可能需要禁用创建时的验证,例如:

# user_locations.rb
validates :user_id, presence: true, on: :update

我假设(@user)块的
\u form.html.erb
中的所有代码都位于
表单中?是的!它住在里面,我把它换成f.simple\u fields\u,但它还是不起作用。谢谢你的建议!您在验证方面是正确的,并且此解决方案确实有效。然而,不幸的是,在创建时,我无法验证用户id是否存在。
SELECT 1 AS one FROM "user_locations" WHERE ("user_locations"."user_id" IS NULL AND "user_locations"."location_id" = 1)
# user_locations.rb
validates :user_id, presence: true, on: :update