【问题标题】:ROR pass params to modalROR 将参数传递给模态
【发布时间】:2016-04-25 18:20:52
【问题描述】:

我正在尝试打开一个显示项目列表的模式。项目列表已作为变量在视图中可用。如何将此变量传递给模态?

下面是主视图的大致样子:

View.html.erb

<div>
  <%= @users.each do |user|%>
    <h1>user.name</h1>
    <h2>user.email</h2>
    <%= link_to remote: true, 'data-toggle' => 'modal', 'data-target' => '#taskModal do %>           
      <i><%= user.tasks.count%></i>
    <% end %>
  <% end %>
</div>

<div class="modal" id="taskModal" aria-hidden="true">
...
<%= render partial: 'list_modal' %>

list_modal是带有模态结构的部分。

【问题讨论】:

标签: ruby-on-rails parameters bootstrap-modal


【解决方案1】:

与视图中已经存在项目列表并希望将其传递给模态相反,您可以做的一件事是制作用于打开模态的按钮(或链接)以通过 ajax 调用控制器操作,然后让动作响应 JS,您现在将在其中使用相应的 view.js 文件来填充模式以及以编程方式呈现它(填充后)。

示例:

打开模态的链接:

<%= link_to "Open users list", users_open_list_modal_path, remote: true %>

用户打开列表模式控制器操作:

def open_list_modal
  @user_list = User.all
  respond_to do |format|
    format.js
  end
end

open_list_modal.js.erb:

//populate modal
$('#modal').html('#{ escape_javascript(<%= render partial: 'user_list', locals: {user_list: @user_list} %> )}');

//render modal
$('#modal').openModal();

然后在模态本身上,您现在可以访问user_list(不是@user_list)列表。

注意:在此示例中,我同时使用了 erbjsmaterial-modal。如果您使用与这些不同的东西(可能是slimhamlcoffeebootstrap...),则必须根据您的情况选择示例。

希望这会有所帮助。

【讨论】:

  • 我考虑过这种方法,但是这种方法不是控制器操作对视图中已经存在的数据进行冗余调用吗?我已经更新了我的 OP 以显示视图的大致样子。有没有一种方法我不需要新操作,但可以将用户变量传递给模态。
  • 那么,您想传递给模态的仅仅是用户任务的计数吗?如果是这样,您可以让您的控制器操作将其作为参数接受,然后将其提供给模态,而无需对数据库进行任何额外调用。
  • 不,计数仅在主视图中显示为链接。当用户点击计数链接时,假设用户有 5 个任务,模式应弹出 5 个任务列表和任务详细信息,例如任务名称任务日期等。由于用户模型与任务是一对多的关系,我只想将“用户”(不是@users)变量传递给模态并在模态中调用 user.tasks。
  • 在这种情况下,我建议不要首先将任务传递给视图,而是将user.id 传递给控制器​​,然后仅获取特定用户的任务,并将这些任务传递给用于呈现模态的js 文件。
  • 我已经按照您的示例设置了所有代码,但是当我单击链接时,我收到了 403 禁止响应 - 由 UsersController#users_open_list_modal 作为 JS 处理在 layouts/public_page_layout 中呈现 public/403.html (0.3ms)
【解决方案2】:

您可以直接将其传递给 modal。在这里我做了什么,在我看来,我有一个触发我的模态的按钮,然后我创建了一个部分(干燥我的代码)_modal.html.erb并在我的按钮之后调用了该部分。

&lt;button type="button" class="btn btn-default" data-toggle="modal" data-target="#modal"&gt;&lt;/button

<%= render 'modal' %>

确保您的模态有 id &lt;div class="modal fade" id="modal" tabindex="-1" role="dialog"&gt;...

老兄!

【讨论】:

    【解决方案3】:

    您可以将其设置为通常对视图组件执行的操作。更好的是,将你的模型分成部分,比如_modal.html.erb。然后你可以通过

    调用模态
    <%= render 'partial_name', :variable_name => your_current_variable %>
    

    该变量现在可以在部分内部以variable_name 的形式使用。此外,如果它是像 @your_current_variable 这样的实例变量,那么它将自动在您的部分中可用。

    【讨论】:

    • 用户变量不是实例变量,只能在循环内使用,因此必须以某种方式通过 link_to 标记传递。请查看更新后的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2013-09-05
    • 2018-07-30
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多