【问题标题】:How can I render different versions of a partial based on which item in a block I click on?如何根据我单击的块中的哪个项目呈现不同版本的局部?
【发布时间】:2025-11-29 11:35:01
【问题描述】:

我有一个模型Painting 有很多记录。我将它们全部打印出来,并且对于每一个我想附加一些 jQuery,以便单击每个绘画呈现带有大版本绘画的部分。

<div id="viewer"></div>
<% Painting.all.each_with_index do |painting, index| %>
    <%= image_tag(painting.path, id:"painting"+index%>
    <% @painting = painting %>
    <script type="text/javascript">
        $("#painting<%=index%>").click(function() {
          $("#viewer").html("<%= escape_javascript(render 'partial') %>");
        });
    </script>
<%end%>

_partial.html.erb

<%= image_tag(@painting.path, class:"large-painting") %>
<!-- more code -->

问题是,@painting 的值在每次循环时都会重置,到最后它等于最后一次绘画。所以无论我点击哪幅画,最后一幅永远是局部渲染的那幅。

谁能想到一种方法,让部分呈现的绘画与我点击的那个相对应,而不需要为每个单独的 jQuery 编写?

【问题讨论】:

  • 你为什么将绘画分配给@painting?只需将其传递给部分render 'partial', painting: painting,然后在部分中使用painting 变量。

标签: javascript jquery ruby-on-rails variables instance-variables


【解决方案1】:

您能否将每个图像的大版本的 URL 添加为图像上的自定义属性,然后使用与用户单击的任何图像对应的 URL 更新查看器引用的 URL?

类似:

$("#painting<%=index%>").click( function(){
    $(Viewer_Image_Element).prop('src', $(this).prop('custom_URL_property')) 
  });

或者,您可以创建一个新的控制器操作(或对现有控制器操作的新响应),该操作通过呈现部分图像来响应。您可以使用$.ajax 在有人单击图像时调用控制器操作,并将图像 ID 作为参数与请求一起发送。服务器将使用参数正确渲染部分,然后在其响应中将其发送回。然后只需将 html 插入查看器。如果这是您要采取的路线,我可以添加一些示例代码。

这也意味着用户在首次加载页面时不需要下载每个图像的大版本。这可能是也可能不是一件好事。

【讨论】:

    最近更新 更多