拥有一个value_for,其值可能为零

时间:2014-04-01 01:52:40

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

用户喜欢的食物。我的用户页面上有一个表单,可让用户输入他们喜欢的食物:

     

但是,如果用户没有favorite_food,我会收到错误First argument in form cannot contain nil or be empty并突出显示@user.favorite_food

如何解决此问题?

3 个答案:

答案 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中隔离该逻辑。

希望这有用。