2016-07-27 3 views
0

Я пытаюсь выполнить вызов ajax от клиента, который агрегирует, а затем возвращает одно случайное объявление с сервера.Неисправность, определяющая пользовательский маршрут в Rails - все запросы ajax по умолчанию отображаются по маршруту show

стороне клиента Ajax вызова

getRandomPerk: function() { return $.ajax({url: url + "/advertisements/get_random_ad.json", type: "GET",dataType: "json", error: this.handleAPIError}); },

routes.rb

resources :advertisements do #collection do # get :get_random_ad #end
member do get :get_random_ad end end

Контроллер advertisement_controller.rb def get_random_ad @advertisement = Advertisement.find_random_advertisement() end

модель advertisement.rb

def self.find_random_advertisement
#ids = Advertisement.select("SELECT id FROM advertisements") Advertisement.find(1) end

(это должно возвращать случайную одно, но я получил его возвращение конкретного один для целей отладки)

журнала сервера

[time:0.000] Started GET "/advertisements/get_random_ad.json" for 10.240.0.75 at 2016-07-27 18:04:17 +0000 [time:0.200] Processing by AdvertisementsController#show as JSON [time:0.201] Parameters: {"id"=>"get_random_ad"} [time:0.207] Advertisement Load (0.1ms) SELECT advertisements.* FROM advertisements WHERE advertisements.id = 0 LIMIT 1 [time:0.208] Completed 404 Not Found in 5.9ms [time:0.209] ActiveRecord::RecordNotFound (Couldn't find Advertisement with id=get_random_ad): app/controllers/advertisements_controller.rb:16:in show'

Почему рельсовый логгер говорит «обработка рекламойСтройлер # шоу»? Разве это не означает «обработка рекламойController # get_random_ad»? Возможно, это фундаментальное недоразумение с моей стороны, но я подумал, что если вы определите новый маршрут в файле routes.rb, он обработает все запросы на этот URL.

+0

То, что происходит в Rails видит 'get_random_ad' как пары, и как таковой он загружает действие шоу. Поскольку маршруты считываются сверху вниз, приоритет имеет #show. Вы используете действие #show? –

+0

Нет, у меня нет действия show, определенного в моих маршрутах. Я знаю, что это определено по умолчанию для моего ресурса, добавив ключевое слово 'only', чтобы переопределить это? –

+0

Вы ставите! Я дал полный ответ на главный пост. –

ответ

1

Поскольку вы не используете действие #show, вы можете использовать аргументы или except. что-то, как это должно работать:

resources :advertisements, except: [:show] do 
    member do 
     get :get_random_ad 
    end 
    end 

Однако, если вы используете только :get_random_ad, вы можете опустить ресурс и вместо того, чтобы использовать

get :random_ad, to: 'advertisements#get_random_ad', as: :random_ad 
+0

Спасибо! Это определенно помогло мне. Единственная проблема сейчас в том, что приложение пытается направить его на представление, когда я хочу только JSON. Есть ли способ предотвратить это? Я делаю все виды просмотра на передней панели. Вот журнал сервера: 'ActionView :: MissingTemplate (Отсутствующие объявления шаблона/get_random_ad, application/get_random_ad с {: locale => [: en],: formats => [: json],: handlers => [: erb,: builder ,: coffee,: rabl]}. Поиск: app/views' –

+1

Вы действительно хотите видеть. Даже ответ json - это «вид». Из-за соглашения Rails он ищет «adsments/get_random_ad» с некоторым типом расширение или другое. Для этого я создам файл 'get_random_ad.json.jbuilder' и проверю документы для jbuilder. –

+1

Вы также можете переопределить путь представления по умолчанию с помощью' render'. Скажите, что у вас есть реклама 'object, вы можете поместить' render json: <объект рекламы> 'в нижней части действия, и вы достигнете аналогичного результата. –

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