Rails:仅在表单中指定时更新属性

时间:2017-12-01 12:19:49

标签: ruby-on-rails forms checkbox attributes

我有一个表单,用户可以在其中添加他们的生日。现在,每当有人提交此表单时,他都会添加一个生日,因为日期输入始终具有值。

有没有办法可以添加一个复选框 - 只有选中它时,生日应该保存到记录中?如果未选中该复选框,则应删除birthday的当前值。

= simple_form_for resource, as: resource_name, url: registration_url(resource_name) do |f|
    = f.input :another_field
    = f.input :birthday_set?, as: :boolean # or something else?
    = f.input :birthday
    = f.input :submit

1 个答案:

答案 0 :(得分:0)

在控制器中,您可以执行以下操作:

def create
  user = User.new
  user.birthday = params[:user][:birthday_set?] ? params[:user][:birthday] : nil
  params[:user].delete(:birthday, :birthday_set?)
  user.update_attributes(user_params)
  ...
end

只需从参数的:birthday元素中删除:birthday_set? / permit个键。

我会考虑将:birthday_set?移到form_tag字段中,使其位于params[:user]之外,然后您就不必担心从参数中清除它。如果你没有将它存储在数据库中,那么无论如何这都更有意义。

这样可以避免被抛出unpermitted parameters,并完全按照您的要求行事。

当切换复选框时,您还可以尝试使用js禁用前端的:birthday字段,但无论如何仍然希望处理此问题。

就个人而言,我会沿@ atomAltera的路线走下去并使用attr_accessorbefore_save,但如果你想避免这种情况,这种方法就可以了。