Kay*_*cas 7 ruby-on-rails devise ruby-on-rails-3.2
我现在搜索了大约一个小时,发现了大量的问题,描述了如何向Devise用户模型添加字段.但是,我找不到任何明确解释如何在注册过程中添加一个或多个模型的方法.
在注册时,我希望用户填写电子邮件地址,密码以及我的客户端模型,公司模型和地址模型(因此我拥有web应用程序正常运行所需的所有信息).
我的模特是这样的
user.rb
Run Code Online (Sandbox Code Playgroud)class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable attr_accessible :email, :password, :password_confirmation, :remember_me, :client belongs_to :client end
client.rb
Run Code Online (Sandbox Code Playgroud)class Client < ActiveRecord::Base attr_accessible :bankaccount, :email, :logo, :mobile, :phone, :website has_many :users has_one :company has_one :address accepts_nested_attributes_for :company, :address end
我认为唯一的方法是创建我自己的RegistrationsController,这样我就可以@client = Client.new在我的视图中执行此操作:
Run Code Online (Sandbox Code Playgroud)<%= f.simple_fields_for @client do |ff| %> <%= f.simple_fields_for :company do |fff| %> <% field_set_tag t(:company) do %> <%= ff.input :name %> <% end %> <% end %> <%= f.simple_fields_for :address do |fff| %> //address inputs <% end %> <% end %> <fieldset> <legend><%= t(:other) %></legend> // other inputs </fieldset> <% end %>
我需要它以这种方式工作的原因是因为我有多个用户可以代表同一个客户端(因此需要访问相同的数据).我的客户端拥有应用程序中的所有数据,因此需要在使用应用程序之前创建.
好吧,我花了大约8个小时,但我终于找到了如何使它工作(如果有人有更好/更清洁的方式这样做,请让我知道).
首先,我已经创建了自己Devise::RegistrationsController的资源来正确构建资源:
class Users::RegistrationsController < Devise::RegistrationsController
def new
resource = build_resource({})
resource.build_client
resource.client.build_company
resource.client.build_address
respond_with resource
end
end
Run Code Online (Sandbox Code Playgroud)
之后我只需要调整config/routes.rb以使其工作:
devise_for :users, :controllers => { :registrations => "users/registrations" } do
get '/users/sign_up', :to => 'users/registrations#new'
end
Run Code Online (Sandbox Code Playgroud)
我的设计/注册/ new.html.erb也有错误.应该是f.simple_fields_for :client而不是f.simple_fields_for @client.
现在,它可以正确创建嵌套属性的所有对象,并在保存资源时自动保存它.