【问题标题】:link_to_remote in Rails renders incorrect URL when rendered from RJS从 RJS 呈现时,Rails 中的 link_to_remote 呈现不正确的 URL
【发布时间】:2009-09-12 23:32:05
【问题描述】:

我有一个“guest”对象的部分,它呈现一个指向这样的销毁操作的链接:

<%= link_to_remote "remove", :url => { :action => "destroy", :id => guest.id } %>

当从 ERB 视图调用时,它可以正常工作,例如

<div id="guests">

@event.guests %>

也就是说,它呈现如下内容:

<a href="#" onclick="new Ajax.Request('/guests/destroy/10', {[options removed]}); return false;">remove</a>

问题是,当这个部分是由于这样的创建操作而从 RJS 呈现时:

page.insert_html :bottom, :guests, :partial => @guest

它不是链接到销毁操作,而是链接到来宾的详细信息/显示操作,例如

a href="#" onclick="new Ajax.Request('/events/1/guests/10', {[options removed]}); return false;">remove</a>

谁能告诉我我做错了什么,或者是否有办法调试这里发生的事情?你可能会说,我是 Rails 的新手 ;)

【问题讨论】:

    标签: ruby-on-rails prototypejs rjs


    【解决方案1】:

    您的做法几乎是正确的,但您并没有完全遵守惯例。请允许我解释一下。

    根据 HTTP 规范,链接被设计为 GET 请求 - 数据检索。您不应该使用链接来修改资源的状态。基本上,不要将链接用于潜在的破坏性操作,因为它们可能会被蜘蛛或加速器跟踪。 Rails 默认让每个链接都成为 GET 请求。所以,当你这样做时:

    <%= link_to_remote "remove", :url => { :action => "destroy", :id => guest.id } %>
    

    它发出了一个 GET 请求。我假设您的 routes.rb 文件中有类似

    map.resources :guests

    这会创建大量路线,您可以像这样使用:

    <%= link_to_remote "remove", :url => guest_path(guest) %>
    

    对于 Rails 中的资源路由,使用的 METHOD 决定了调用的控制器操作。

    使用 GET 请求调用的 URL /guests/1 调用 SHOW 操作。您需要在 link_to_remote 调用中指定方法 - :get、:put、:post 或 :delete。 :put 用于更新,:post 用于创建,:delete 用于删除。

    <%= link_to_remote "remove", :url => { :action => "destroy", :id => guest.id }, :method => :delete %>
    

    或清洁剂,

    <%= link_to_remote "remove", :url => guest_path(guest), :method => :destroy %>
    

    但是说真的,不要使用链接。使用按钮。

    <%= button_to_remote "remove", :url => guest_path(guest), :method => :destroy %>
    

    希望有帮助!

    【讨论】:

    • 链接实际上是删除或删除数据的好方法。使用按钮生成或创建数据以及删除或销毁数据的链接是很常见的,特别是在表格上。他为什么不使用它们?
    • 感谢@Brian 提供的最佳实践示例——这很有帮助!我倾向于同意@Yaraher 的观点,即在某些情况下使用指向破坏性操作的链接是可以接受的,特别是因为该操作是在 onclick 上执行的,因此爬虫和预加载器不会意外执行该操作(我认为?)。但我明白你的意思,这不是最安全的事情。再次感谢 Brian 和 Yaraher 的意见!
    • @Yaraher:不,链接不是一种“好”的方法,它们的常见用途不是一个好的借口。 GET 请求旨在从服务器检索数据,而不是修改后端的数据。 ajaxian.com/archives/… 请注意,在 Rails 中使用其他方法的链接仅适用于启用 Javascript 的情况,这可能会使页面对于禁用 JS 的屏幕阅读器或不支持 JS 的移动用户无用。 CSS 可以修复表格单元格内按钮的呈现问题,并且让按钮看起来像链接是微不足道的。
    • 方法(在这种情况下是 GET 与 DELETE)不是该方法正确性的一个更大的方面吗?无论是链接还是按钮都是演示问题,而不是协议问题。将该方法设置为 DELETE 将阻止爬虫跟踪该链接。如果禁用 JS 是一个问题(是的,应该是),我个人的意见是你应该使用其他方法来适应它。让非 JS 考虑过度影响呈现给具有 JS 能力的网站访问者的 UI 将是一种耻辱。但除了对按钮的不同看法外,我认为您的回答是正确的。
    【解决方案2】:

    原来“destroy”在 Rails 中有特殊的含义。我将销毁操作重命名为删除,它工作正常。

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 1970-01-01
      • 2018-05-07
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      相关资源
      最近更新 更多