2012-05-13 3 views
1

Хорошо, я искал по всему миру и не могу найти решение, с которым я могу работать ... поэтому я решил опубликовать здесь.Создайте 2 модели одновременно

У меня есть 2 модели

магазин

class Store < ActiveRecord::Base 
    attr_accessible :storeimage, :storename 
    belongs_to :user 

    validates :user_id, :presence => true 
end 

и

Пользователь

class User < ActiveRecord::Base 
    attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :userimage, :remove_userimage 
    has_secure_password 
    has_many :gears 
    has_many :comments, :dependent => :destroy 
    has_one :store, :dependent => :destroy 
    before_save :create_remember_token 
    require 'carrierwave/orm/activerecord' 
    mount_uploader :userimage, UserpicUploader 
    accepts_nested_attributes_for :store 

    ... 

end 

Когда кто-то создает новую учетную запись пользователя, мне нужно AUT omatically создать новый магазин для этого пользователя, о котором я думал в пользовательской форме. Итак, как я могу создать новый объект хранилища, связанный с создаваемым новым пользователем?

Вот мой код от контроллера пользователя для CreateAction

def create 
    @user = User.new(params[:user]) 
    if @user.save 
     sign_in @user 
     redirect_to @user, :flash => {:success => "Welcome to Equiptme"} 
    else 
     render 'new' 
     @title = "Sign up" 
    end 
    end 

Посмотреть

<div class="signup_container"> 
    <div class="signup_container_interior"> 
    <%= provide(:title, 'Sign up') %> 
    <%= form_for(@user) do |f| %> 
    <% if @user.errors.any? %> 
     <div> 
     <div> 
      The form contains <%= pluralize(@user.errors.count, "error") %>. 
     </div> 
     <ul> 
     <% @user.errors.full_messages.each do |msg| %> 
      <li>* <%= msg %></li> 
     <% end %> 
     </ul> 
     </div> 
    <% end %> 
     <div class="register_field"> 
     <div class="register_nonerror_container"> 
      <%= f.label :first_name %>&nbsp;<%= f.text_field :first_name, class: 'register_text_area' %> 
     </div> 
     </div> 
     <div class="register_field"> 
     <div class="register_nonerror_container"> 
      <%= f.label :last_name %>&nbsp;<%= f.text_field :last_name, class: 'register_text_area' %> 
     </div> 
     </div> 
     <div class="register_field"> 
     <div class="register_nonerror_container"> 
      <%= f.label :email %>&nbsp;<%= f.text_field :email, class: 'register_text_area' %> 
     </div> 
     </div> 
    <!--************STORE FIELDS ************** --> 

    <!--************STORE FIELDS END ************** --> 

     <div class="register_field"> 
     <div class="register_nonerror_container"> 
      <%= f.label :password %>&nbsp;<%= f.password_field :password, class: 'register_text_area' %> 
     </div> 
     </div> 
     <div class="register_field"> 
     <div class="register_nonerror_container"> 
      <%= f.label :password_confirmation %>&nbsp;<%= f.password_field :password_confirmation, class: 'register_text_area' %> 
     </div> 
     </div> 
     <div class="actions"> 
     <%= f.submit "Create Account", class: 'register_button' %> 
     </div> 
    <% end %> 
    </div> 
</div> 
+1

почему вы не использовали обратный вызов after_save с методом 'new_record? '? – caulfield

+0

Вы выполнили поиск на странице [docs groups docs] (http://guides.rubyonrails.org/association_basics.html#has_one-association-reference)? –

ответ

4

Вы можете использовать build_association method созданные вместе с has_one отношений между пользователями и магазинами:

def create 
    @user = User.new(params[:user]) 
    @user.build_store 

    # etc 
end 

Если вы не нуждаетесь в магазин, пока вы не сохранили пользователь, вы можете также использовать create_association:

if @user.save 
    @user.create_store 
    # etc 
    end 
+0

Это похоже работа. Спасибо. – DaveG

+0

Я решил использовать create_association. Как передать параметр, например: storename? – DaveG

+0

Как будто вы вызывали create: '@ user.create_store (: storename => 'House of Pancakes')' – rjz

Смежные вопросы