Rails не выбирает правильный макет для запросов javascript - PullRequest
0 голосов
/ 27 января 2012

У меня в приложении два разных макета, один для запросов javascript (AJAX) и один для обычных запросов.

# application.html.haml for non-js requests (abbreviated)
!!!
%html
  %head
  %body
    = yield

# and application.js.coffee for js requests
App.modal """<%= yield %>""" # creates a javascript modal

Любая ссылка с :remote => true теоретически должна использовать макет javascript.Это работает в определенных случаях, но не работает в других.

Работает по этой ссылке:

%li= link_to "Login", new_user_session_path, remote: true

# log output:
Started GET "/users/sign_in?&authenticity_token=KwyFmzGgR7Rdx3dudJDvw8b5rngvVDrwfTpYLPIPjEI=" for 127.0.0.1 at 2012-01-27 03:29:41 -0500
Processing by Devise::SessionsController#new as JS
  Parameters: {"authenticity_token"=>"KwyFmzGgR7Rdx3dudJDvw8b5rngvVDrwfTpYLPIPjEI="}
  Rendered devise/shared/_links.erb (0.9ms)
  Rendered devise/sessions/new.html.haml within layouts/application (6.3ms)
Completed 200 OK in 167ms (Views: 165.9ms | ActiveRecord: 0.0ms)

# output in the javascript console:
XHR finished loading: "http://localhost:3000/users/sign_in?&authenticity_token=KwyFmzGgR7Rdx3dudJDvw8b5rngvVDrwfTpYLPIPjEI=".

Но не работает для этой:

%li= link_to "Account", edit_user_registration_path, remote: true

# log output:
Started GET "/users/edit?&authenticity_token=KwyFmzGgR7Rdx3dudJDvw8b5rngvVDrwfTpYLPIPjEI=" for 127.0.0.1 at 2012-01-27 03:31:24 -0500
Processing by Devise::RegistrationsController#edit as JS
  Parameters: {"authenticity_token"=>"KwyFmzGgR7Rdx3dudJDvw8b5rngvVDrwfTpYLPIPjEI="}
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  MobilePhone Load (0.3ms)  SELECT "mobile_phones".* FROM "mobile_phones" WHERE "mobile_phones"."user_id" = 1 LIMIT 1
  Rendered devise/registrations/edit.html.haml within layouts/application (6.7ms)
Completed 200 OK in 157ms (Views: 154.4ms | ActiveRecord: 0.6ms)

# output in the javascript console:
XHR finished loading: "http://localhost:3000/users/edit?&authenticity_token=KwyFmzGgR7Rdx3dudJDvw8b5rngvVDrwfTpYLPIPjEI=".

После некоторой простой отладки я понял, что второй запрос набирает application.html.haml (неверно!), А первый - application.js.coffee (правильно!).Оба успешно обрабатываются ajax.

Я немного озадачен здесь.Я надеюсь, что совершаю простую ошибку, которую кто-то сможет указать!

Спасибо!

PS Я использую рельсы 3.2.1 (и ранее пробовал на 3.1.3 ста же проблема)

РЕДАКТИРОВАТЬ: Не уверен, если это что-то меняет, но я использую драйвер mootools-rails: https://github.com/kevinvaldek/mootools-ujs/blob/master/Source/rails.js. Для заголовка accept правильно установлено значение text / javascript.1025 *

Ответы [ 4 ]

2 голосов
/ 26 августа 2012

У меня возникла та же проблема, я попытался с новым rails 3.2.7 с нуля и, поскольку я использовал application.haml вместо application.html.erb , удаленные ссылки былине работает.Я пробовал эту работу вокруг:

  1. Конвертировать application.haml в частичное, переименовать application.haml в _application.haml
  2. В application.html.erb всего одна строка:

    <%= render 'application' %>
    
0 голосов
/ 27 января 2012

Если вы используете jQuery UJS, попробуйте добавить атрибут

 data-type="script"

в тег ссылки.Это установит dataType запроса jQuery, который в свою очередь устанавливает заголовок Accepts: вашего http-запроса.Rails использует это, чтобы угадать подходящий тип ответа для вашего запроса.

См. Этот блог для получения дополнительной справочной информации: http://www.alfajango.com/blog/rails-3-remote-links-and-forms-data-type-with-jquery/

0 голосов
/ 02 февраля 2012

Это то, что я должен был сделать, чтобы заставить это работать: (и не имеет ничего общего с библиотекой javascript)

# whatever_controller.rb
def index
  respond_to do |format|
    format.js   # renders index.html.haml inside application.js.haml layout
    format.html # renders index.html.haml inside application.html.haml layout
  end
end

В качестве альтернативы, вы можете просто переименовать шаблон для действия в index.js.haml вместо index.html.haml, что будет работать для запросов ajax без использования respond_to. Однако это будет означать, что поисковые системы и браузеры без включенного javascript не смогут получить доступ к странице.

Другой способ, который также будет работать, - это использование respond_with:

# application_controller.rb
respond_to :html, :js

# whatever_controller.rb
def index
  respond_with # will render the appropriate layout
end
0 голосов
/ 27 января 2012

Что касается макета, вы должны указать это явно на контроллере.Возможно, вы можете изменить имя application.js.coffee на другое имя и добавить макет «new_name» в верхней части контроллера.

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