Rails技术在重定向后执行javascript

时间:2012-12-19 10:38:07

标签: javascript jquery ruby-on-rails

启用了Rails app(3.2.8)和turbolinks(不确定相关的)。

  1. 我有一些信息,用户显示页面上有一个link。 (例如,某事发生变化的通知。)
  2. 当用户点击链接时,我想将他引导至页面
  3. 视觉突出显示已更改的元素。
  4. 目前我打算像这样处理它:

    创建链接,使其形式为:

    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

2 个答案:

答案 0 :(得分:5)

除了在您重定向到的网页上包含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魔术来突出显示实际的元素。

答案 1 :(得分:2)

可能的方法之一:

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

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

在评论视图中

<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