【问题标题】:Rails - How to differentiate an action call from different pages?Rails - 如何区分不同页面的动作调用?
【发布时间】:2010-07-04 14:09:59
【问题描述】:

我为特定资源定义了destroy 操作。完成后,它使用具有视觉效果的 rjs 文件从调用它的页面中删除资源。

我的问题是 destroy 动作可以从 2 个不同的模板中调用。因此视觉效果需要有所不同,具体取决于从哪个模板调用...有没有办法这样做...?

1:我认为我可以做到这一点的一种方法是有一个destroy 动作和一个destroy-variant 动作,其中一个模板调用destroy-variant 动作,另一个调用正常的.. . 但是,我很确定这与 DRY 的想法背道而驰。老实说,我也不完全确定该怎么做……在 URL 选项中使用 :method => :delete, :action => :destroy-variant 会起作用吗?

2:对我来说,另一种可能的方法是找出哪个页面正在调用该操作,然后根据需要推出不同的 rjs 文件。但我完全不知道如何区分哪个页面正在执行操作调用。

3:最后的方法就是我重做模板/RJS,这样两个模板都可以应用相同的视觉效果。

非常感谢您的建议! :)

【问题讨论】:

  • 为什么不直接将参数传递给指定要使用的效果的远程函数(例如,调用页面)?

标签: ruby-on-rails templates action rjs


【解决方案1】:

您没有提及您正在使用的 javascript 库。这个解决方案是基于 jquery 的。只需一个操作destroy 即可轻松完成您想做的事情。但我会建议一种不同的技术来解决它。我发现 rjs 很受限制。去 jquery taconite 插件。它的所有标记,而不是......一堆 erb 混合的 javascript 不太吸引人的眼睛!

所以现在您将拥有destroy.xml.erb 而不是您的destroy.rjs。在我进入您需要添加的内容之前,让我们看看您需要为您的 destroy 操作进行哪些修改。

之前:

   def destroy
        @model = Model.find(params[:id])
        @model.destroy

          respond_to do |format|
            format.html { redirect_to :action => :index }
            format.xml
          end
    end

之后:

   def destroy
        @model = Model.find(params[:id])
        @model.destroy
        @template = params[:template]
          respond_to do |format|
            format.html { redirect_to :action => :index }
            format.xml
          end
    end

在你的 routes.rb 中添加一个命名路由来简化事情:

map.destroy_using_template 'destroy/:id/:template', :controller => "controller", :action => "destroy"

在你看来:

将 jquery taconite 插件添加到 <layout>.html.erb 的标题中,

<%= javascript_include_tag "jquery.js", "jquery.taconite.js" %>

在模板 1 的视图中:

假设你使用链接删除。

   <%= link_to "Delete", destroy_using_template_path(:id => "1", :template => "temp1"), :method => :delete, :confirm => "Are you sure you want to delete the record?" %>

模板 2 也是如此:

假设你使用链接删除。

   <%= link_to "Delete", destroy_using_template_path(:id => "1", :template => "temp2"), :method => :delete, :confirm => "Are you sure you want to delete the record?" %>

现在在你的destroy.xml.erb

<taconite>
    <% if @template=="temp1" %>
      <remove select="#template1" />
    <% elsif @template=="temp2" %>
      <remove select="#template2" />
    <% end %>

    <eval>
        //OPTIONAL: Execute some javascript here if you want. You can do most of the DOM modifications using taconite itself.
        alert("HEY!!!");
    </eval>
</taconite>

现在不容易吗? :)

请记住,在使用 taconite 时,您必须确保 destroy.xml.erb 中的代码符合 XML。确保关闭所有打开的标签。在此处阅读有关铁燧岩的更多信息:http://malsup.com/jquery/taconite/

Taconite 在标记中实现了所有常规的 jquery DOM 修饰符以及它自己的一些额外修饰符。如果您想切换到 javascript,只需在 eval 标记中包含该 javascript,即可轻松实现,如上所示。

【讨论】:

  • 内置帮助器的问题在于它很突兀,并且会阻止(相当困难)做你想要实现的事情。如果您使用过 jquery 并且对它感到满意,那么我建议您尽快放弃使用内置帮助程序。 Jquery 为您简化了很多事情。如果您想要一个教程来设置所需的基本 ajax,请检查我的这个答案。我已经提供了所有开始的步骤:stackoverflow.com/questions/3004371/…
  • 使用突兀的 javascript 的另一个缺点是它不能被正确缓存,从而导致严重的性能损失。另一方面,不显眼的 javascript 的优点是整个代码可以组合在一个文件中,并使用编译器进行压缩(压缩)。您可以将 javascript 想象成图像之类的东西。每次请求页面时,它都会在客户端下载并执行。如果它存储在一个文件中,它可以被浏览器缓存,这样就不需要每次都下载它。这将极大地加快您的网站速度。
  • 哇。您在另一篇文章中的回答远远超出了我的舒适/经验水平,这并不好笑......我将完成这些步骤并尝试了解正在发生的事情以及原因。你提供了很多细节,这太棒了。我现在只需要时间弄清楚。多谢! :) PS:不,我以前没有使用过 jquery。 :(
  • 关于params[:template] 位...这是我遇到的一个问题,我如何真正找出从代码中调用的模板?它似乎没有自动添加到params 哈希中,我无法找到将其作为参数传递的方法。
  • 我也在答案中给出了这一点。如果您观察路线map.destroy_using_template 'destroy/:id/:template', :controller =&gt; "controller", :action =&gt; "destroy",您可以看到您将模板作为参数传递。现在您将如何从视图中实际传递它?你这样做:` "1", :template => "temp1"), :method => :delete, :confirm => "你确定要删除记录?” %>`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多