【问题标题】:Rails: Only update attribute when specified in formRails:仅在表单中指定时更新属性
【发布时间】:2018-05-15 13:16:17
【问题描述】:

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

有没有办法可以添加一个复选框 - 只有当它被选中时,生日才应该保存到记录中?如果未选中该复选框,则应删除 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

【问题讨论】:

  • 这个最简单的方法是使用 before_save 回调来跟踪birthday_set 参数,如果为false,则设置生日为null,api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
  • @atomAltera 难道没有更简单的方法,因为这意味着我还需要一个attr_accessor
  • 那么你应该在控制器级别解决这个问题。假设您有 create_params 帮助器,它返回模型创建所需的所有字段。你可以在那个助手里面做这个检查
  • 如果复选框参数为真,您可以在控制器端修改它,否则保存,反之亦然。
  • @Gabbar SRack 指出您的解决方案存在一些问题。

标签: ruby-on-rails forms checkbox attributes


【解决方案1】:

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

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

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

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

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

您还可以考虑在切换复选框时使用 js 禁用前端中的 :birthday 字段,但无论如何仍要处理此问题。

就个人而言,我会沿着@atomAltera 的路线使用attr_accessorbefore_save,但如果你想避免这种情况,这种方法会奏效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2014-07-07
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多