У меня есть ряд ресурсов, которые я хочу получить только при доступе через JS-формат. Ресурсы маршрутов Rails дают мне форматы плюс стандартный HTML. Есть ли способ указать, что будут созданы только маршруты формата JS?
Rails Routes - ограничение доступных форматов ресурса
Ответ 1
Вы просто добавляете ограничения в формате:
resources :photos, :constraints => {:format => /(js|json)/}
Ответ 2
Вы должны перенести эти маршруты в область видимости. К сожалению, ограничения в этом случае не работают должным образом.
Это пример такого блока...
scope :format => true, :constraints => { :format => 'json' } do
get '/bar' => "bar#index_with_json"
end
Более подробную информацию можно найти здесь: https://github.com/rails/rails/issues/5548
Ответ 3
Ни один из вышеперечисленных решений не работал у меня. Я закончил с этим решением:
post "/test/suggestions", to: "test#suggestions", :constraints => -> (req) { req.xhr? }
Найдено на https://railsadventures.wordpress.com/2012/10/07/routing-only-ajax-requests-in-ror/#comment-375
Ответ 4
как насчет
# routes.rb
class OnlyAjaxRequest
def matches?(request)
request.xhr?
end
end
post "/test/suggestions", to: "test#suggestions", :constraints => OnlyAjaxRequest.new
он вообще не попадает в контроллер. Взято из railsadventures
Ответ 5
Если вам нужен не только один или другой, чем json
(не использовать #xhr?
), я предлагаю вам вариант ниже
resource :offers, only: :show, format: true, constraints: { format: 'pdf' }
Надеюсь, что это поможет
Ответ 6
Вы можете использовать before_filter
, который вызывает ошибку маршрутизации, если формат запроса не равен MIME::JS
.
приложение/контроллеры/application_controller.rb:
class ApplicationController < ActionController::Base
before_filter :check_js
private
def check_js
raise RoutingError.new('expected application/json') unless request.format == MIME::JS
end
end
Приложите этот фильтр более хирургически с помощью :only
, :except
и :skip_before_filter
, как описано в рельсах Руководство по Action Controller