【问题标题】:Ruby on Rails - Show the same modal with different contentRuby on Rails - 显示具有不同内容的相同模式
【发布时间】:2018-08-03 04:48:20
【问题描述】:

我有一个主页,其中包含一个表格中的软件列表。

通过此链接,我以模式打开我的软件页面:

<% = link_to software_path (software), remote: true do %> ... <% end%>

我创建了一个脚本,允许我在单击带有 .clickable 类的 td 时打开我的模态,而当我单击带有 .no-click 类的 td 时不打开模态。

$(".clickable").click(function(e) {
  if (!$(e.target).hasClass('no-click')) {
      $('#software-modal').modal('show');
    }
});

结构:

_software.html.erb 打开_software_modal.html.erb

问题: 当我尝试通过脚本打开我的模态时,它总是打开相同的模态。也就是点击软件2,软件3,...打开软件1的模态,直接用链接就没有问题了。

所以我的脚本中有 id 或类似问题...

你能帮帮我吗?

编辑 1:根据 VAD 的响应,我尝试使用 data-id 搜索 id。

_software.html.erb

<tr class="clickable" data-id="<%= software.id %>">
...
</tr>
<div id='software-content'></div>

_software_modal.html.erb

<div id="software-modal" class="modal fade" role="dialog">
...
</div>

show.js.erb

$('#software-content').html("<%= j render 'software_modal', software: @software %>");
$('#software-modal').modal('show');

这个 show.js.erb 允许我通过示例链接打开我的模式:

<%= link_to software.name, software_path(software), remote: true,class:"no-click" %>

但不是通过可点击的表格。

所以我在 _software.html.erb 中添加了一个脚本,使我的表格可点击:

  $(".clickable[data-id]").click(function(e) {
    if (!$(e.target).hasClass('no-click')) {
      window.location = '/softwares/' + $(this).attr('data-id');
    }
});

我也尝试使用数据链接,...有没有办法在模式中打开这个 window.location(如链接)?我昨天搜索了几个小时,但我没有找到任何东西..

编辑 2

根据@VAD 的响应,渲染布局:false,我们可以输入:

class ApplicationController < ActionController::Base
   layout proc{|c| c.request.xhr? ? false : "application" }
end

允许对 js 进行虚假渲染,对 html 进行真实渲染。所以要让我的 html 页面与我的起始布局保持一致。

谢谢@dogenpunk Render without layout when format is JS (needs drying)

【问题讨论】:

  • 更新了我的答案,看看吧

标签: ruby-on-rails


【解决方案1】:

对于要从中显示模态的每个位置,您都需要有不同的模态。就像software1 一样,您需要显示具有与此特定对象相关的内容的模式。对于software2,您需要展示相同的模型,但具有相对于software2 的全新内容

另一种选择(也是更好的选择)是,您可以为每个 Software 对象拥有一个模态,但通过某些事件(例如实际显示模态),您将使用特定于此的数据更新模态内容特定的Software 对象。您可以为此使用一些控制器操作

附加

尝试在 clickable 元素中将软件 ID 作为数据参数传递,然后使用 ajax 等更新模态内容

<div class = 'clickable' data-id = "#{software.id}">
</div>

$(".clickable").click(function(e) {
  if (!$(e.target).hasClass('no-click')) {
      $.get('/softwares/' + $(this).attr('data_id'), function(data) {
        $('#software-modal body').html(data);
      }); 
      $('#software-modal').modal('show');
    }
});

当然我不能给出精确的代码,所以你需要根据你当前的设置来调整它

更新

这个想法是你在softwares_controller.rb 中有show 动作,它最终会为你的模态渲染内容:

def show
  // some code you need
  render layout: false
end

它将呈现show.html.erb 视图。在该视图中,您应该保留模态内容的 html。请注意,该操作将在没有布局的情况下呈现该视图。你需要这个,因为你很快就会把这个 html 放入模态框,所以你不需要像布局这样的任何额外的 html。

因此,您有一个操作,它通过其 id 为每个 software 对象呈现模式内容。

现在您需要将其放入模态框。

您的标记中有clickable 元素。您将通讯员software id 附加到他们作为data-id。然后在您的 jquery 代码中,您使用这些 id 来构造一个这样的 url:

'/softwares/' + $(this).attr('data_id')

此网址将引导您在softwares_controller.rb 中执行show 操作。因此,通过单击 clickable 元素之一,您获取 id,使用它生成 url,向 url 发送请求,获取响应(模态内容),然后将其放入模态,如下所示:

$.get('/softwares/' + $(this).attr('data_id'), function(data) {
  $('#software-modal body').html(data);
}); 

然后您显示已更新内容的模式:

$('#software-modal').modal('show');

【讨论】:

  • 感谢您的回复!抱歉耽搁了,但我昨天还是等了几个小时才回答:)在你的回答中有一些我无法理解的东西,我找到了我的软件的网址,但我无法在模态中打开它们。我编辑我的问题..也许你能帮我:)再次感谢
  • 好的谢谢我开始明白原理了!我设法以模态方式打开我的页面,但是在我看来,这种技术给我带来了一些不便。如果我的页面 /softwares/1 没有返回布局,那么 SEO 会怎样?谢谢你,你的回答让我提高了知识!
  • @ClydeT,不幸的是我不精通搜索引擎优化,所以不能给你任何建议。我们只是在项目中使用了这个解决方案,处理实体表和每个实体的模态,所以我认为这完全符合你的情况。关于布局。布局将在那里,它将在您的 clickable 元素所在的视图周围。如果您需要在模式以外的其他位置显示software 对象,则需要使用不同的操作或将一些布尔值传递给操作以检查您是否需要与视图一起呈现布局跨度>
  • 你好@VAD,我有最后一个小问题......有没有办法确保通过脚本而不是在softwares_controller中打开渲染?例如,我尝试了 $('#software-modal body') 等几种解决方案。 html ("");而不是:$ ('# software-modal body')。 html(数据);但没有成功......
  • 我终于找到了一个解决方案,它允许使用我的模态 js 进行错误渲染,但我的 html 页面不会出现错误!如果您感兴趣,我会编辑我的问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多