如何使用控制器将对象传递给局部对象?

时间:2019-01-07 18:16:42

标签: ruby-on-rails ruby-on-rails-5

我一直在尝试将我的Product对象传递给我的渲染部分,但是无论我如何尝试都不起作用。主页上有一个快速查看按钮,弹出一个模式(部分),我想将正确的产品传递给它。

路线

get 'shop-product-ajax-page', to: "pages#shop_product_ajax_page"

主页(为简洁起见,简称为链接)

<% @products.each do |product| %>
  <%= link_to "Quick View", shop_product_ajax_page_path, :data => {:lightbox => 'ajax'} %>
<% end %>

控制器动作

def shop_product_ajax_page
  render :partial => 'pages/shop_product_ajax_page', :layout => false
end

现在,该按钮将起作用并以模式显示HTML。我希望能够为选择的任何Quick View产品填充正确的产品信息。

1 个答案:

答案 0 :(得分:0)

问题在于该链接正在发出一个完全独立的AJAX请求,它分别访问服务器,因此您期望的Ruby上下文(变量等)在该新请求中不可用。

两个选择:

  • 不发出AJAX请求,而是将灯箱呈现为页面的一部分。您可以使用display: none或类似的方法将其隐藏,然后在单击链接时使用Javascript将其显示。
  • 以当前方式发送请求,但传入与当前控制器操作用于获取@products的参数相同的参数,并在shop_product_ajax_page中执行相同的操作以访问数据库并获取产品。

第二种选择可能会更容易而又不会弄乱JS。就像这样:

def shop_product_ajax_page
  @products = get_products_from_params(params)
  render :partial => 'pages/shop_product_ajax_page', :layout => false
end

private

  def get_products_from_params(params)
    Product.find(params["product_ids"]) # or whatever you're currently doing
  end