2015-06-17 6 views
2

У меня есть 2 модели:Создание form_for для модели ассоциации

марки

has_many :products 

продукт

belongs_to :brand 

На мой взгляд (show_brand.html.erb), я отображаю всю информацию о бренде, используя @brand.name ....

Я хочу, чтобы создать форму для продукта что BELONGS_TO бренд я уверен, отображение информации о.

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

form_for(@brand.products) ... 
  1. Как я могу преформ, что?
  2. Как я могу прикрепить user_id к продукт формы (продуктаbelongs_toпользователя) без добавления его в контроллере вручную

ВНИМАНИЕ: О первом пункте в моем списке, я знаю, что это может быть выполнено путем обновления маршрутов для вложенного и проходящего массива с основным объектом и объектом ассоциации. Но если есть другой способ сделать это? Без изменения routes.rb и ...

ответ

1

Для вопроса 1 вы можете использовать «вложенную форму». Пожалуйста, проверьте ниже ссылку. http://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast

Для вопроса 2, несмотря на то, что вы установили user_id в «форме продукта», вам все равно нужно выполнить некоторую проверку в вашем контроллере/модели, если для любого нежелательного значения установлено значение user_id. Таким образом, лучший способ - вы сами устанавливаете его на бэкэнд.

1

Вы можете использовать accepts_nested_attributes_for.

#brand_controller.rb 

def new 
    @brand = Brand.new 
    @product = @brand.products.build 
end 

def create 
    @brand = Brand.new(brand_params) 
    if @brand.save 
    ..... 
    else 
    ..... 
    end 
end 

private 

def brand_params 
    params.require(:brand).permit(:id, brand_attribute_1, brand_attribute_2, products_attributes: [:id, :product_attribute_1, :user_id, :product_attribute_2]) 
end 

В вашей форме

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

----code for brand attributes --- 

    <%= f.fields_for @product do |p| %> 
    ----code for product attributes---- 
    <%= p.hidden_field user_id, :value => current_user.id %> #to attach user_id to product 
    <% end %> 

<%= f.submit "Submit" %> 
<% end %> 
+0

Я знаю о вложенной форме, но я не могу использовать fields_for потому что я не использую form_for бренда. Я использую form_for @product – Src

+0

@Src Обновление сообщения с кодом формы и кодом контроллера. – Pavan

+0

Хорошо, но теперь, когда я отправляю форму, она вызывает метод обновления в контроллере бренда (потому что форма находится в представлении ** show **, и я использую '@brand = Brand.find (params [: id])' to отображать данные в представлении «бренд/шоу») и ожидает обновления бренда, а не просто создания продукта. Как я могу справиться с этим? – Src