用户喜欢的食物。我的用户页面上有一个表单,可让用户输入他们喜欢的食物:
但是,如果用户没有favorite_food,我会收到错误First argument in form cannot contain nil or be empty
并突出显示@user.favorite_food
。
如何解决此问题?
答案 0 :(得分:1)
根据Rails documentation,您需要在ActiveRecord Object
构建器中提供form_for
。如果您还没有任何价值,则需要提供new
ActiveRecord对象,通常通过定义Model.new
来完成:
#app/controllers/your_controller.rb
def new
@object = Model.new
end
#app/views/controller/new.html.erb
<%= form_for @object do |f| %>
但是,我刚刚了解到你可以在表格中提供一个符号:
#app/views/controller/new.html.erb
<%= form_for :object do |f| %>
我很欣赏这个答案相当广泛。如果您提供一些代码,我可以修改它以修复以符合您的要求
答案 1 :(得分:1)
使用嵌套属性时我遇到了同样的问题 - 其中存在has_one或has_many关系。我的例子是“hospital”has_one“contact_detail”,如果没有ContactDetail对象,则表单失败。要解决这个问题,我必须在渲染表单之前构建一个子对象。
像 -
@hospital = Hospital.new
@hopital.build_contact_detail # Name of the association is contact_detail
在你的情况下,我认为你应该这样做:
@user.build_favorite_food # Favorite food being name of association
希望它有所帮助!
答案 2 :(得分:0)
已发布的两个答案都是正确的,尽管它们并不完整。要使其适用于@user
favourite_food
和<%= form_for (@user.favourite_food || @user.build_favourite_food) do |f| %>
,您的表单需要执行以下操作:
{{1}}
这样,如果用户有喜欢的食物,表单将自动并正确地填充属性。如果用户没有,那么它将创建一个新的。
另一个好的做法是在FormHelper中隔离该逻辑。
希望这有用。