Ruby on rails 轨道:嵌套的\u表单\u用于<;列>;can';不要空白
我试图使用嵌套的表单gem创建一个下拉列表,显示链及其位置的列表。当用户单击submit按钮时,嵌套的_表单应该在名为users_locations的joiner表中创建一个新条目。但是,表单会显示一个错误,如下所示: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
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