【问题标题】:rails render view onclick with javascriptrails 使用 javascript 渲染视图 onclick
【发布时间】:2015-11-01 23:10:45
【问题描述】:

我正在尝试创建一个视图,用户可以在其中单击不同的按钮并根据他们单击的按钮呈现不同的内容。我试过用 JS 完成这个,但不能真正让它工作。我在视图中做了一个按钮:

<div class="link">
  <%= link_to "Greetings", "#" %>
</div>
<div id="show"></div>

然后在job.js.erb中:

$(function() {
  $('.link').click(function() {
    $('#show').append("<%=escape_javascript render(:partial => 'show' %>");
  });
});

不幸的是,资产不支持渲染,但我真的不知道实现这一点的最佳方法是什么。

【问题讨论】:

  • 好吧,如果你使用资产,你不应该混合使用 javascript 和 rails。 ajax 呢?

标签: javascript jquery ruby-on-rails


【解决方案1】:

您可以尝试的一种方法是通过 AJAX 让按钮单击转到控制器操作,然后呈现名称为 &lt;action_name&gt;.js.erb 的文件。然后,此文件将能够调用 render 操作。

我将详细说明以下内容:

假设有问题的资源是Greetings,例如,您在Greetings 控制器中有一个dynamic_show 操作,并且您有一个指向该操作的dynamic_show_greetings_path 路由。

在您的视野中,您可以:

<div class="link">
  <%= link_to "Greetings", dynamic_show_greetings_path, remote: true %>
</div>
<div id="show"></div>

Greetings#dynamic_show 操作将如下所示:

def dynamic_show
  respond_to do |format|
    format.js
  end
end

然后,在您的视图目录中,您有一个dynamic_show.js.erb 文件,其中将包含附加动态视图的脚本,如下所示:

$('#show').html("<%=escape_javascript render(:partial => 'show') %>");

这就为你解决了!

当然,现在要使其动态化,您必须将参数传递给控制器​​,然后根据获得的响应呈现内容。

PS:

  • 在链接上设置remote: true 可确保调用将是AJAX 调用。
  • 控制器动作默认呈现与动作名称相同的文件,因此,dynamic_show响应js将呈现dynamic_show.js.erb

希望这能给你带来很大的启发...... ;)

【讨论】:

    【解决方案2】:

    听起来你需要 jQuery。

    您可以使用隐藏类将渲染的部分包装在父 div 中。当按钮被点击时切换显示内容。

    http://api.jquery.com/show/

    $('#your-button').click(function(e){
        $('.hidden-div').toggleClass('hide');
    });
    

    【讨论】:

      【解决方案3】:

      有两种方法可以做到这一点。

      首先,如果你想在 on-page 加载 JS,你需要使用 @anchalee 建议的内容,并使用某种预加载内容CSS 中的“隐藏”类:

      #app/assets/javascripts/application.js
      $(document).on("click", "a.hidden", function(e){
         e.preventDefault();
         el = $(this).attr("href");
         $(el).toggle();
      });
      
      #app/views/controller/your_view.html.erb
      <%= link_to "User", "#user", class: "hidden" %>
      <div id="user" class="hidden">
          Hello
      </div>
      

      这将采用由链接的href 属性指定的具有id 的任何div,然后根据其当前状态使div 变为hideshow

      --

      其次,您有 off-page 方法(使用 ajax)。

      这用于从服务器获取数据,并将用于加载以服务器为中心的数据,例如您现在尝试执行的操作。

      这样做其实很简单:

      #app/controllers/your_controller.rb
      class YourController < ApplicationController
         layout: Proc.new{|c| !c.request.xhr? }
      end
      

      这将返回您需要的任何数据,而无需 layout

      #app/assets/javascripts/application.js
      $(document).on("click", "#show", function(e){
         e.preventDefault();
         $.get($(this).attr("href"), function(data){
            $("#show").html(data);
         });
      });
      
      #app/views/your_controller/show.html.erb
      <%= link_to "Show", [[url for page]], id: "show" %>
      

      【讨论】:

      • 第二种方法似乎是我想要的,因为我需要加载很多不同的页面,所以预加载和隐藏它们不是要走的路。但是我在控制器布局部分出现错误(意外的':')。你能再解释一下吗?我真的不明白你在那里做什么。
      猜你喜欢
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 2013-01-10
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多