Проблема с link_to_remote в рельсах - PullRequest
4 голосов
/ 29 марта 2009

У меня проблема с согласованностью при использовании link_to_remote в rails.

У меня есть 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} %>

Получившийся Аякс ...

<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. Параметр: action отсутствует на этом пути. Зачем? Это приводит к неправильному коду для меня, но я не могу понять, почему это происходит. Вызовы link_to_remote практически идентичны.

Пожалуйста, направьте меня в правильном направлении. Спасибо.

Ниже приведен мой файл route.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 ]

3 голосов
/ 29 марта 2009

Что вы получите, если скопируете это в ваше представление?

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

Я подозреваю, что проблема действительно не в link_to_remote, а в маршрутизации . Как только url_for вернет ожидаемый вами URL, попробуйте снова link_to_remote.

2 голосов
/ 31 марта 2009

Простое добавление: method =>: delete к вашему вызову 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 не достигает этого результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...