rails中的link_to_remote问题

时间:2009-03-29 12:57:16

标签: ruby-on-rails ruby ajax

我在rails中使用link_to_remote遇到了一致性问题。

我有2个link_to_remote用例,它们生成不同的ajax。我无法弄清楚为什么,这让我发疯了。

这是用例一......

<%= link_to_remote "section-", :update => "sections", :url => {:action => :destroy, :controller => "sections", :id => @section.id } %>

这将生成适当的ajax(如下所示)并按预期工作。请注意,它从调用中获取:action参数并将其正确插入到ajax中。

<a href="#" onclick="if { new Ajax.Updater('sections', '/sections/destroy/1', {asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + encodeURIComponent('f5e50e62fafd118e4588b33c9571ea6eef864176')}); }; return false;">section-</a>

我还有另一个使用link_to_remote的实例,但它会生成不正确的ajax。除了控制器不同之外,用例几乎相同。无论哪种方式,我都不希望这导致不同的ajax。

电话......

<%= link_to_remote "question-", :update =>"questions-1", :url => {:action => :destroy, :controller => "questions", :id => @question.id} %>

由此产生的ajax ......

<a href="#" onclick="if { new Ajax.Updater('questions-1', '/questions/1', {asynchronous:true, evalScripts:true, parameters:'authenticity_token=' + encodeURIComponent('f5e50e62fafd118e4588b33c9571ea6eef864176')}); }; return false;">question-</a>

这里明显的区别在于Ajax.Updater的第二个arg。 :该路径中缺少:action param。为什么?这会导致我的代码损坏,但我无法理解为什么会发生这种情况。 link_to_remote调用几乎完全相同。

请指出正确的方向。感谢。

以下是我的routes.rb文件......


ActionController::Routing::Routes.draw do |map|
  map.resources :questions, :has_one => :section, :collection => { :sort => :post }
  map.resources :sections, :has_many => :questions, :has_one => :form, :collection => { :sort => :post }
  map.resources :forms, :has_many => :sections

  # You can have the root of your site routed with map.root -- just remember to delete public/index.html.
  map.root :controller => "forms"

  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

2 个答案:

答案 0 :(得分:3)

如果将其复制到您的视图中,您会得到什么?

<%= url_for :action => :destroy, :controller => :questions, :id => @question.id %>

我怀疑问题与link_to_remote无关,而是routing。一旦url_for返回您期望的URL,然后再次尝试link_to_remote。

答案 1 :(得分:2)

只需添加:method =&gt; :删除你的link_to_remote电话可能是最简单的解决方法:

<%= link_to_remote "question-", :update =>"questions-1", :url => {:action => :destroy, :controller => "questions", :id => @question.id}, :method => :delete %>

这应该强制调用/ questions /:id来使用HTTP DELETE方法。如果你想让上面的调用生成url / questions / destroy /:id,我相信你需要手动更改你的路由,因为默认的map.resources似乎没有达到那个结果。