【问题标题】:catch nested_attributes on create to stop duplicates在创建时捕获嵌套属性以停止重复
【发布时间】:2014-01-19 18:15:00
【问题描述】:

使用 Rails,我有以下形式...

Events#New - 表单部分

<%= simple_form_for @event, multipart: true do |f| %>

  ...

  <% unless signed_in? %>
    <%= f.simple_fields_for :user do |u| %>
      <%= u.input :name %>
      <%= u.input :email %>
    <% end %>
  <% end %>

  ...

  <%= f.submit %>

<% end %>

一旦提交该表单,它将创建表单和nested_attribute。哪个 Event 属于一个用户。

事件模型

class Event < ActiveRecord::Base
  belongs_to :user

  accepts_nested_attributes_for :user
end

但我的问题是,这些字段是必填字段,您无需登录即可提交此表单。

我想要的是当您填写表单并且用户电子邮件存在时,它应该只将事件添加到该用户,否则它应该创建一个新的用户记录。 现在它所做的只是添加额外的用户记录。

我设法以不使用nested_attributes 并仅接受params[:name]params[:email] 的方式进行工作,然后进行检查,如果存在将其添加为User.find_by(email: params[:email]).builds.events(event_params),但我想直接修改方式模型处理数据,因为我觉得控制器不适合这个逻辑。

对此的任何帮助将不胜感激!

谢谢:)

【问题讨论】:

    标签: ruby-on-rails forms nested-attributes


    【解决方案1】:

    不要使用嵌套属性,使用表单类方法,请参阅http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/ 上的“3. 提取表单对象”部分了解如何做到这一点的一种方法,

    嵌套属性有一种方式一遍又一遍地咬你,而你只是找到了其中一个

    【讨论】:

    • 感谢分享!我想表单视图必须更改 simple_fields_for 并且只有纯 text_field_tags?
    • 是的,只是简单的旧标签,就像您在模型上使用“普通 crud”一样,验证器和持久性将由表单类处理。我构建了一个非常好的表单类 gem,它将模型验证器委托给表单和各种漂亮的噱头,但我是个坏人,还没有写任何文档 github.com/bbozo/simple_form_class。如果您有兴趣,我会努力并提供一些示例
    • User.find_or_create_by(email: event_params([:user_attributes][:email]) 返回no implicit conversion of Symbol into Integer
    • 我们正在讨论这个问题,我们不应该这样,所以我稍后会删除此评论。使用railscasts.com/episodes/280-pry-with-rails 确定控制器中发生的事情的正面和反面,事情就会变得清晰,如果您遇到问题,请在 SO 上提出另一个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多