4

我正在尝试使用设计为注册添加一些额外的逻辑。我有两个注册表单,一个具有另一个对象的附加字段,该对象通过 habtm 关系连接。我已经扩展了设计注册控制器并创建了新对象(如果存在),但我不确定如何在此方法中获取新创建的用户。

在我的自定义 registrations_controller.rb 中:

class RegistrationsController < Devise::RegistrationsController
  def create
    unless params[:business].nil?
      @business = Business.new(params[:business])
    end
    super
    #@user.businesses << @business  #how can I implement something like this?
  end

end
4

2 回答 2

2

我以前做过与此非常相似的事情。看看这个问题Make a fields_for block 条件

有两种方法可以做到这一点。一个快速而肮脏,另一个充分利用了轨道。

方法一

首先在你的模型中,确保你有accepts_nested_attributes_for :businesses然后在你的控制器中确保你有类似的东西

params[:user][:businesses] = [ params[:business] ]

方法二

您可能想要做的一件事就是利用您的模型来发挥自己的优势。在您的视图中使用fields_for块允许您指定可以从模型设置方式假定的关系。

仍然确保accepts_nested_attributes_for :businesses您的模型中有

在您的控制器中,您需要进行一些更改。

def new
  resource = build_resource({})
  resource.businesses.build  # Inserts a blank object for business
  respond_with resource
end

现在不要在创建操作中触摸任何内容,因为您可以删除添加的代码位。

在视图中,您可以在其中找到您的业务表格和注册表单。添加类似的东西。

<% form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  # some user form stuff
  <%= f.fields_for :business do |i| %>
    <%= render "/users/registrations/business", :form => i %>
  <% end %>
<% end %>

保存时,您的控制器应该识别出您正在自动向用户添加业务。

您可能需要尝试实际的格式和命名,但这使得在 Rails 中提交表单更容易使用。这也符合保持控制器美观和瘦身的理念。

于 2013-02-01T16:47:59.780 回答
1

新创建的User对象可用作 variable resource

所以,resource.businesses << @business会工作。

于 2015-12-20T12:00:42.457 回答