在create上捕获nested_attributes以停止重复

时间:2014-01-19 18:15:00

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

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

活动#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。哪个事件属于一个用户。

活动模型

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)但我我想直接修改模型处理数据的方式,因为我觉得控制器不适合这种逻辑。

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

谢谢:)

1 个答案:

答案 0 :(得分:1)

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

嵌套属性有一种方法可以一遍又一遍地咬你,你刚刚找到其中一个