2016-01-18 4 views
3

Я создаю форму в Rails (версия 4.2.5), чтобы собирать основную информацию о магазинах, и я хотел бы иметь форму отправки данных в две отдельные модели - один из которых называется Store, который собирает информацию о магазине, а один называется адресом, который просто содержит информацию о адресе. Я видел этот вопрос, который плавает вокруг Stack и в другом месте, но я довольно новичок в Rails и могу использовать немного более пошаговые инструкции. (Кроме того, я знаю о Race geocoder gem, но не хочу использовать его в этом проекте, несмотря на то, что я собираю адрес и информацию lat/long)Rails - одна форма для двух моделей

Для начала, вот мои магазины и Адресные модели ...

class Store < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :store_type 
    has_one :address 
end 

class Address < ActiveRecord::Base 
    belongs_to :store 
end 

и мой StoresController ...

class StoresController < ApplicationController 

    def new 
     @store = Store.new 
     @storeType = StoreType.all 
    end 

    def create 
     @store = Store.new(store_params) 
     @store.user = current_user 

     if @store.save 
      flash[:notice] = "New store created" 
      redirect_to root_path 
     else 
      #ERROR STUFF 
     end 
    end 

    private 
    def store_params 
     params.require(:store).permit(:user_id, :store_type_id, :latitude, :longitude, :name, :notes) 
    end 
end 

Наконец, форма для создания нового магазина (не включая адрес) ...

<%= form_for @store do |f| %> 

    <%= f.hidden_field :latitude, :id => "latitude_field" %> 
    <%= f.hidden_field :longitude, :id => "longitude_field" %> 

    <div class="field"> 
     <%= f.label :store_type_id %> 
     <%= f.select :store_type_id, @storeType.map{ |type| [type.store_type.capitalize, type.id] } %> 
    </div> 

    <div class="field"> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 
    </div> 

    <div class="field"> 
     <%= f.label :notes %> 
     <%= f.text_field :notes %> 
    </div> 

    <div class="actions"> 
     <%= f.submit :"Submit" %> 
    </div> 
<% end %> 

Таким образом, готовая форма передает вышеуказанные поля в модель магазина, а также включает поля для улицы, города, штата и zip, которые являются полями, которые будут переданы модели Address.

В целом, что лучше всего подходит для этого?

И в качестве последующего вопроса у моей модели Address есть столбец для store_id - будет ли этот столбец автоматически заполняться идентификатором для хранилища, поскольку он создается, если модели Store и Address заполняются из того же форме? Или я выхожу из своей лиги здесь?

спасибо.

ответ

2

Вы будете лучше смотреть в accepts_nested_attributes_for:

#app/models/store.rb 
class Store < ActiveRecord::Base 
    has_one :address 
    accepts_nested_attributes_for :address 
end 

#app/controllers/stores_controller.rb 
class StoresController < ApplicationController 
    def new 
     @store = current_user.stores.new 
     @store.build_address 
    end 

    def create 
     @store = current_user.stores.new store_params 
     @store.save 
    end 

    private 

    def store_params 
     params.require(:store).permit(:store_type_id, :latitude, :longitude, :name, :notes, address_attributes: [:line_1]) 
    end 
end 

#app/views/stores/new.html.erb 
<%= form_for @store do |f| %> 
    <%= f.fields_for :address do |a| %> 
     <%= a.text_field :line_1 %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 
+0

Это потрясающе, спасибо. Это очень четкое объяснение, и я понимаю, как работают части. – skwidbreth

+0

Спасибо, человек, пока он работает - вот и все, что считается :) –

2

Вы можете использовать accept_nested_attributes_for :address в Store модели, а затем создать экземпляр Адресная образуют с fields_for

Что-то вроде этого:

class Store < ActiveRecord::Base 
    has_one :address 
    accept_nested_attributes_for :address 
end 

class StoresController < ApplicationController 

    def new 
    @store = Store.new 
    @store.build_address 
    end 
end 

<%= form_for @store do |f| %> 
    <%= f.fields_for @store.address do |ff| %> 

Вы также должны белый список address_attributes в StoreController и сохранить адрес сразу объект Store сохраняется.

+0

Благодаря человеку - это здорово. Принял другой ответ, хотя, потому что он показывает, как «вложить» сильные параметры, которые я бы не понял самостоятельно. – skwidbreth

+0

Как сохранить адрес после сохранения хранилища? У меня есть аналогичная проблема –

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