2013-05-30 2 views
-1

У меня есть Categories и Products. A имеет отношение belongs_to :categoryрельсы создать страницу от

В категории show page У меня есть кнопка для добавления нового продукта. Эта кнопка переходит на страницу, где я создаю новый продукт, но мне нужно указать категорию для нового продукта.

Как я могу передать id с страницы category, где я был на новом продукте? Итак, если я в категории Electronic, я нажимаю «Добавить товар», и этот продукт автоматически связан с категорией Eletronic.

Надеюсь, вы поймете, чего я хочу. Спасибо

+1

Вам нужно будет попытаться найти ответ самостоятельно, а затем попросить о помощи вместо того, чтобы просто попросить других найти ответ для вас. – Justin

+0

проблема в том, что я уже пытался найти, как это сделать, но я не нашел то, что я действительно хотел. –

ответ

0

Во-первых, я хотел бы решить, будет ли каждый продукт содержится в категорию, или является ли это просто связано с категория. Подсказки в нем содержатся:

  • Вы ожидаете, что каждый продукт будет иметь ровно одну «родительскую» категорию.
  • Вы ожидаете, что каждый продукт всегда будет отображаться в контексте его родительской категории.

Если и только если вы уверены, что это дело, я был бы соблазн гнезда продукта ресурсов в пределах категории.

# routes.rb 
resources :categories do 
    resources :products 
end 

# products_controller.rb (SIMPLIFIED!) 
class ProductController < ApplicationController 
    before_filter :get_category 

    def new 
    @product = @category.products.build 
    end 

    def create 
    @product = @category.products.build(params[:product]) 

    if @product.save 
     redirect_to @product 
    else 
     render template: "new" 
    end 
    end 

    def get_category 
    @category = Category.find(params[:category_id]) 
    end 
end 

Если вы сделаете это, рельсы обеспечат соответствие вашего продукта соответствующей категории. Магия происходит в @category.products.build, которая автоматически устанавливает category_id на основе отношения.

Если вы не хотите сохранить категории и продукты, как простые ассоциации, я бы просто использовать параметр запроса в соответствии с Эриком Andres ответа, хотя я бы желанием справиться с этим в несколько иначе:

# link: 
new_product_path(category_id: @category.id) # So far, so similar. 

# products_controller.rb 
class ProductsController < ApplicationController 
    def new 
    @product = Product.new 
    @product.category_id = params[:category_id].to_i if params[:category_id] 
    end 
end 

# new.erb 
<%= f.hidden_field :category_id %> 

Это в основном просто стилистическая разница. Ответ Эрика тоже будет работать - я просто предпочитаю устанавливать значение самой модели, а не беспокоиться о параметрах и т. Д.

+0

Спасибо за это замечательное объяснение. Я не буду использовать вложенные элементы, потому что я новичок в рельсах, но это еще одна вещь, которую я знаю, что могут делать рельсы. –

1

Вам необходимо передать category_id в вашу ссылку, например. new_product_path(category_id: @category.id).

Вы также должны иметь поле в виде продукта, чтобы сохранить идентификатор категории, в например <%= f.hidden_field :category_id, params[:category_id] %>

+0

Спасибо, это действительно помогло. Я не знал скрытое поле, и мне пришлось перейти на link_to. Я использовал button_to. –

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