我想为新的User对象创建一个虚拟帐户。每当用户在我的应用中注册时,它都会自动为他创建一个帐户。
但是发生的事情是,我在数据库中保存了新用户,而不是新帐户。在这种情况下,我也不知道尊重MVC模式设计的最佳方式是什么。我害怕复制代码或让一个控制器完成两个工作。
注册表单,嵌套资源(并且它构建在设计之上)
<h2>Sign up</h2>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :name %><br />
<%= f.text_field :name %></div>
<div><%= f.label :email %><br />
<%= f.email_field :email, :autofocus => true %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<p>Account name</p>
<%= f.fields_for :account do |builder| %>
<fieldset>
<%= builder.label :title %>
<%= builder.text_field :title %>
</fieldset>
<% end %>
<div><%= f.submit "Sign up" %></div>
<% end %>
<%= render "devise/shared/links" %>
我的用户模型:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :accounts
accepts_nested_attributes_for :accounts
end
和我的帐户模型:
class Account < ActiveRecord::Base
belongs_to :user
end
我的用户控制器:
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
sign_in @user
##flash[:success] = "Welcome to the HighTide!"
redirect_to @user
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password,
:password_confirmation, accounts_attributes: [:id, :title])
end
end
最后是账户管理员:
class AccountsController < ApplicationController
def new
@account = @user.accounts.new
end
def create
@account = current_user.accounts.new(account_params)
if @account.save
redirect_to '/'
end
end
private
def account_params
params.require(:account).permit(:title, :user_id, products_attributes: [:id, :title, :units], bookings_attributes: [:id, :name, :check_in, :check_out])
end
end
编辑:
routes.rb文件
Hightide::Application.routes.draw do
devise_for :users, path_names: {sign_in: "login", sign_out: "logout"}
resources :users do
resources :accounts
end
resources :sessions
match '/users/:user/edit', to: 'users#edit', via: [:post, :get]
devise_scope :user do
root to: 'static_pages#home'
match '/sessions/user', to: 'devise/sessions#create', via: :post
end
答案 0 :(得分:0)
您的form_for只能将其数据发送到单个控制器方法,在这种情况下,它会将您的表单中的参数发送到Devise注册控制器。这些参数包括新帐户的值,但它们永远不会覆盖您的用户#create或accounts #create methods。
您可能需要创建自定义Devise控制器。看看这个问题和答案,它很好地解决了这个问题。 Nested registration data in Rails 3.1 with Devise。