【问题标题】:Rails routing sometimes confuses method for object IDRails 路由有时会混淆对象 ID 的方法
【发布时间】:2016-07-28 14:14:59
【问题描述】:

所以我有一个带有控制器的 Rails 应用程序,该控制器有很多方法。由于某种原因,应用程序有时无法正确解释对该控制器的调用。例如:

    A 404 error occurred on the Production server at 2016-07-28 02:55:23 UTC:
Message:

Problem: Document(s) not found for class Section with id(s) publish_preview. Summary: When calling Section.find ... [etc.]

Requested Params

    {"action"=>"update", "controller"=>"sections", "organization_id"=>"goannunciation", "bulletin_id"=>"20160731", "id"=>"publish_preview"}

Url:

bulletinbuilder.org/organizations/goannunciation/bulletins/20160731/sections/publish_preview

因此,sections 控制器有一个“publish_preview”方法,这个 URL 应该——而且通常会——适当地调用它。但是,最近该应用程序没有正确解释 URL;从堆栈中:

"/var/www/bulletin_builder/releases/20160725175809/app/controllers/sections_controller.rb:34:in `update'"

这表明应用程序正在调用“更新方法”,使用实际方法调用“publish_preview”作为部分的 id。这一定是某种路由错误......可能与标题有关?浏览器相关?

 resources :organizations do
  ...
  resources :bulletins do
   ...
   resources :sections do
    collection do
      get :manage
      get :first_section
      get :bulletin_creation
      get :included_sections
      get :custom_sections_max_message
      get :search
      get :publish_preview
      get :admin_diagnostics
    end
    member do
      post :remove
      post :removed_blocked_section
      get :delete_dynamic
      get :update_included
      get :update_added
      get :share
      get :unshare
      get :refresh
    end
  end

正如我在下面的评论中提到的,相关路线没有改变,问题只是偶尔发生。

此外,由于某种原因,服务器会针对同一错误发送一堆 (17) 封错误通知电子邮件,所有这些电子邮件都在几秒钟之内发生。

【问题讨论】:

  • 能否请您发布此特定控制器的路线

标签: ruby-on-rails mongodb object methods


【解决方案1】:

这很可能与用于访问资源的 HTTP 方法有关。例如,

GET /organizations/../sections/publish_preview

将按预期点击publish_preview 操作;然而

PUT/POST /organizations/../sections/publish_preview

update:id 打成publish_preview

如果您实际使用更新操作,则可以添加一个约束以仅路由数字 id

resources :sections, constraints: { id: /\d+/} do
  ...
end

如果您不使用更新操作,只需删除更新路线

resources :sections, except: [:update]

还有其他方法可以处理此问题,但根据您的情况,上述两种可能是最容易实现的。

【讨论】:

  • 这很有道理...最近更改了方法以处理发送大量数据。然而,“管理”方法的方法并没有改变,而且这个方法也给我们带来了问题。为什么不一致?似乎我应该能够依靠rails首先查看URL是否正在调用一个方法,如果不是,那么假设它是一个CRUD函数......
  • 实际上,section 路由中的 HTTP 方法都没有改变,尽管它们最近在其他一些区域。
  • 并不矛盾。 Rails 将根据routes.rb 中定义的规则路由请求。如果您向../sections/publish_preview 发出PUT 请求,它将总是 触发update 操作,因为这就是您定义路由的方式。我会查看您的代码中是否有任何内容向该 URL 发出 PUT 请求。
【解决方案2】:

所以这是一个非常奇怪的间歇性问题。这有点复杂,但显然可以归结为:

有一种方法调用了许多其他方法。其中一些方法被放在一个单独的线程中,因为它们需要一段时间才能运行。封闭方法有时会在调用其他方法的线程完成之前以“return_to :back”结束。

这显然对应用程序做了一些奇怪的事情,包括弄乱了正在运行的线程中使用的参数,并导致了一些非常奇怪的错误。该问题已通过将 return_to :back 替换为 render json: 语句来解决。

【讨论】:

    猜你喜欢
    • 2016-07-04
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多