【问题标题】:Rails technique to execute javascript after redirect重定向后执行javascript的Rails技术
【发布时间】:2012-12-19 10:38:06
【问题描述】:

Rails 应用 (3.2.8) 和 turbolinks(不确定是否相关)已启用。

  1. 我有一些信息,用户展示页面上的link。 (例如,某事发生变化的通知。)
  2. 当用户点击链接时,我想将他定向到页面
  3. 直观地突出显示发生变化的元素。

目前我打算这样处理:

创建链接,使其具有以下形式:

project2/comment.1453

创建一个notifications controller,,它获取projects2 和更改类型comment 及其ID 1453。所以理论上我想重定向到projects2 并在该页面上突出显示 id 为 1453 的评论。问题是:重定向后如何突出显示评论?

notificationscontroller.rb(伪代码!)

def show
  project = Project.find(params[:project_id])
  comment = Comment.find(params[:commment_id])
  redirect_to project AND highlight!
end

在我的研究过程中,我遇到了 Backbone,看起来 Backbones 路由器可以通过使用函数(注释的突出显示)响应 url 来解决这个问题。但我对 Backbone 没有任何经验。

我不确定这种功能的一般方法是什么。并希望避免走错路。如果您能帮助我,那就太好了。

编辑:一个小问题:我不确定comment.1453 使用哪个字符是#更好的选择? (comment#1453)

【问题讨论】:

    标签: javascript jquery ruby-on-rails


    【解决方案1】:

    除了在重定向到的页面上包含 javascript 之外,您无法在重定向后运行 javascript。

    您想要的是将此请求中的信息传递到下一个(重定向的)请求。

    闪光灯是一个很好的方法。通常你会用它来发短信:

    redirect_to project, notice: "Project foo bar message"
    

    flash[:notice] = "Project foo bar message"
    redirect_to project
    

    没有什么可以阻止您在闪存中使用其他标识符并将 JSON 存储在其中。

    flash[:highlight_ids] = "[12, 43, 472, 482]"
    redirect_to project
    

    然后在您的布局中或某处提取此 Flash 消息到 JavaScript:

    var highlight_ids = <%= flash[:highlight_ids] %>;
    

    然后使用你的 javascript 魔法来突出显示实际元素。

    【讨论】:

    • 我觉得这比将信息存储在 cookie 中更干净,所以我将接受这个答案。谢谢
    【解决方案2】:

    一种可能的方式:

    在会话中或直接在 cookie 中(伪代码中的show 操作)存储 id(以及可能的对象类型,如果需要突出显示的不仅是 cmets)

    def show
      project = Project.find(params[:project_id])
      comment = Comment.find(params[:commment_id])
      cookies[:highlight_id] = comment.id
      cookies[:highlight_type] = 'Comment' # optionally
      redirect_to project
    end
    

    在项目控制器show 操作中

    def show
      ...
      if cookies[:highlight_id] and cookies[:highlight_type]
        @highlight_id = cookies[:highlight_id]
        @highlight_type = cookies[:highlight_type]
        cookies.delete[:highlight_id]
        cookies.delete[:highlight_type]
      end
    

    在 cmets 视图中

    <div class="some_class <%= highlight(@comment, @highlight_id, @highlight_type %>" ...
    

    highlight 是一个像这样的助手

    def highlight(object, object_id, object_type)
      if object_id and object_type and object.is_a?(object_type.classify.constantize)
        'highlighted'
      end
    end 
    

    【讨论】:

      【解决方案3】:

      偶然发现这篇文章并决定添加一个我在 Rails 4.1 中使用的解决方案。

      class CoolController < ApplicationController
        respond_to :html, :js
      
        def controller_action
          # controller stuff
      
          respond_to do |format|
            format.html {
              return redirect_to my_redirect_path, notice: "Successfully updated payment method!"
            }
            format.js
          end
        end
      end
      

      执行名为controller_action.js.erb的js文件,页面成功重定向到my_redirect_path

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多