简体   繁体   中英

Not saving on the database from nested form

I want to create a dummy account for a new User object. Whenever a user signs up in my app it should automatically create an account for him.

But what's happening is, I'm saving in the database the new User, but not the new Account. I'm also not aware what's the best way to respect the MVC pattern design when it comes to this situation. I'm afraid of replicating code or to have one controller doing the work of two.

The sign up form, has nested resources (and it's build on top of devise)

<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" %>

My User Model:

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :accounts

  accepts_nested_attributes_for :accounts

end

and my Account Model:

class Account < ActiveRecord::Base

  belongs_to :user

end

My User Controller:

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

and finally the Account Controller:

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

EDIT:

routes.rb file

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

Your form_for can only send its data to a single controller method, and in this case it is sending the params from your form to the Devise registrations controller. Those params include the values for the new account, but they never reach your users#create or accounts#create methods.

You'll probably have to create a custom Devise controller. Take a look at this SO question and answer, which lays it out nicely. Nested registration data in Rails 3.1 with Devise .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM