我在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
答案 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似乎没有达到那个结果。