【问题标题】:Trouble defining custom route in Rails - all ajax requests are defaulting to the show route在 Rails 中定义自定义路由时遇到问题 - 所有 ajax 请求都默认为显示路由
【发布时间】:2016-12-01 21:50:04
【问题描述】:

我正在尝试从客户端进行 ajax 调用,该调用聚合然后从服务器返回单个随机广告。

客户端 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

控制器广告_controller.rb def get_random_ad @advertisement = Advertisement.find_random_advertisement() end

模特广告.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'

为什么 Rails 记录器显示“由 AdvertisementsController#show 处理”?它不应该说“由 AdvertisementsController#get_random_ad 处理”吗?也许这是我的一个基本误解,但我认为如果您在 routes.rb 文件中定义了一个新路由,那么它将处理对该 URL 的所有请求。

【问题讨论】:

  • Rails 将 get_random_ad 视为参数,因此它加载了 show 动作。由于路由是从上到下读取的,因此 #show 优先。你在使用#show 操作吗?
  • 不,我的路线中的任何地方都没有定义显示操作。我知道这是为我的资源默认定义的,是否会添加 only 关键字覆盖它?
  • 你打赌!我在主帖上做了一个完整的回答。

标签: ruby-on-rails ruby json ajax


【解决方案1】:

由于您没有使用#show 操作,因此您可以使用onlyexcept 参数。像这样的东西应该可以工作:

   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

【讨论】:

  • 谢谢!这绝对帮助了我。现在唯一的问题是应用程序试图将其定向到视图,而我只需要 JSON。有什么办法可以防止这种情况发生吗?我在前端做所有视图的东西。这是服务器日志:ActionView::MissingTemplate (Missing template advertisements/get_random_ad, application/get_random_ad with {:locale=>[:en], :formats=>[:json], :handlers=>[:erb, :builder, :coffee, :rabl]}. Searched in: app/views
  • 你实际上想要一个视图。即使是 json 响应也是一个“视图”。由于 Rails 约定,它正在寻找带有某种扩展名的advertisements/get_random_ad。为此,我将创建文件 get_random_ad.json.jbuilder,并查看 jbuilder 的文档。
  • 您还可以使用render 覆盖默认视图路径。假设您有一个Advertisement 对象,您可以将render json: <advertisement object> 放在操作的底部,您将获得类似的结果。
  • 非常感谢!我认为直到现在我才了解有关 Rails 的一些基本知识。将使用工作代码更新我的问题!
  • 没问题!如果您有任何问题,请随时在此处发表评论。
猜你喜欢
  • 1970-01-01
  • 2020-10-13
  • 2018-02-14
  • 1970-01-01
  • 2015-09-26
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多