2010-09-09 4 views
21

У меня есть ряд ресурсов, которые я хочу получить только при доступе через JS-формат. Ресурсы маршрутов Rails дают мне форматы плюс стандартный HTML. Есть ли способ указать, что будут созданы только маршруты формата JS?Маршруты Rails - ограничение доступных форматов для ресурса

+1

Какую версию Rails вы используете? – Garrett

+2

Можете ли вы принять мой ответ ниже, его правильный, текущий выбранный ответ неверен и запутывает сообщество. – koonse

ответ

16

Вы просто добавить ограничения о формате:

resources :photos, :constraints => {:format => /(js|json)/} 
+0

Если я не делаю что-то неправильно, это все еще позволяет мне получить доступ к фотографиям как: html. Я получаю сообщение о недостающем шаблоне, когда я ожидаю исключение исключаемого маршрута. Мысли? –

+0

Не должно быть '/ (js | json) /'? – Garrett

+0

Да, я поймал это и изменил его. Все еще не работает для меня. У меня есть ресурсы: members,: controller => 'homes/members',: constraints => {: format =>/js /} –

-1

Вы можете использовать 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 Guide

+0

I ' ve использовал аналогичный подход для решения этой проблемы https://github.com/marcusg/force_format – marcus3006

51

Вы должны обернуть эти маршруты в области. К сожалению, ограничения в этом случае не работают должным образом.

Это пример такого блока ...

scope :format => true, :constraints => { :format => 'json' } do 
    get '/bar' => "bar#index_with_json" 
end 

Более подробную информацию можно найти здесь: https://github.com/rails/rails/issues/5548

+4

Это должно быть отмечено как ответ. –

+3

Если вы используете 'resources', вам не нужен блок видимости, просто добавьте' 'format => true' и': constraints => ... 'непосредственно к вызову' resources'. – Nathan

+0

Это работало в моем случае для ресурсоемкого маршрута.'resources: photos, format: true, constraints: 'json'' – maicher

0

как о

# routes.rb 

class OnlyAjaxRequest 
    def matches?(request) 
    request.xhr? 
    end 
end 

post "/test/suggestions", to: "test#suggestions", :constraints => OnlyAjaxRequest.new 

не добраться до контроллер вообще. Получено с railsadventures

0

Если вам нужно не только тот или иной, чем json (использование косяка #xhr?) Я предлагаю вам вариант ниже

resource :offers, only: :show, format: true, constraints: { format: 'pdf' }

Надеюсь, это поможет

Смежные вопросы