Rails link_to pass :id from show to another contro

2019-09-06 14:54发布

问题:

I'm viewing 1 product in show.html.erb and there's a link below that says "View other products from this company". This link_to connects to another non-restful action in same controller which retrieves from DB other products of same company as was shown in show.html.erb.

Can link_to pass the :id of the current product in show to action it's rendering? I'm new to rails and please let me know if question is not making sense. I'm not sure if routes need to be defined as well. Thanks.

products_controller.rb

def show
 @company_products = Product.by_company
end

show.html.erb

<%= link_to "View other products from this company", company_products_path(:anchor => "#{@company_products}") %>

routes.rb

get '/company_products_' => 'products#company_products'

回答1:

You want to do something like this:

@company_products.each do |company|
  link_to "View other products from this company", products_path(company)
end

routes:

resources :products



回答2:

I finally resolved it by passing the :id of object in show via link_to to a non-restful action.

I'm open to suggestions if entire @company_products in #show can be passed as it is because I'm first finding if there are any other products for that company and if there are, passing an id only in link_to and in controller#company again running a query to get same data of all products to display. so running same query twice is not DRY.

controller#show remains the same as originally posted.

routes.rb

resources :products do
  get :company, on: :member
end

show.html.erb

<%= link_to "View other products from #{@company_name}", company_product_path(@product.company_id) %>

controller#company

def company
  @products_of_company = Product.where(company_id: params[:id])
end

Now in company.html.erb, the list is just displayed.