我正在尝试使用设计为注册添加一些额外的逻辑。我有两个注册表单,一个具有另一个通过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
答案 0 :(得分:1)
之前我做过类似的事情。看看这个问题Make a fields_for block conditional
有两种方法可以做到这一点。一个是快速而又脏的,另一个充分利用了铁轨。
方法1
首先在你的模型中,确保你有accepts_nested_attributes_for :businesses
然后在你的控制器中确保你有类似的东西
params[:user][:businesses] = [ params[:business] ]
方法2
您可能想做的其中一件事就是使用您的模型。在您的视图中使用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
现在不要触摸create action中的任何内容,就像你可以删除你添加的代码一样。
在视图中,您的营业表格和注册表格一致。添加类似的内容。
<% 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中提交表单更加合适。它也符合意识形态,保持控制器的美观和薄。
答案 1 :(得分:0)
新创建的User
对象可用作变量resource
。
所以,resource.businesses << @business
会起作用。