不从嵌套表单保存在数据库中

时间:2013-12-18 15:35:53

标签: ruby ruby-on-rails-4

我想为新的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

1 个答案:

答案 0 :(得分:0)

您的form_for只能将其数据发送到单个控制器方法,在这种情况下,它会将您的表单中的参数发送到Devise注册控制器。这些参数包括新帐户的值,但它们永远不会覆盖您的用户#create或accounts #create methods。

您可能需要创建自定义Devise控制器。看看这个问题和答案,它很好地解决了这个问题。 Nested registration data in Rails 3.1 with Devise