【问题标题】:How does Rails know which controller's "show" action to use in this example from Rails Guides?Rails 如何从 Rails Guides 知道在这个示例中使用哪个控制器的“显示”操作?
【发布时间】:2013-11-09 20:50:42
【问题描述】:

我正在查看 Rails 指南的 "Rails Routing From The Outside In" 部分,我遇到了这个部分:

有时,您有一个客户总是在没有的情况下查找的资源 引用一个 ID。例如,您希望 /profile 始终显示 当前登录用户的个人资料。在这种情况下,您可以使用 将 /profile(而不是 /profile/:id)映射到 显示动作:

get 'profile', to: 'users#show'

传递要匹配的字符串将需要控制器#action 格式, 而传递一个符号将直接映射到一个动作:

get 'profile', to: :show

指南说“传递符号将直接映射到动作”,但假设我有多个控制器,每个控制器都有一个“显示”动作。 Rails 怎么知道要使用哪一个,因为我不再引用特定的控制器?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 routes actioncontroller


    【解决方案1】:

    该文档有点误导,不是吗。这是一个糟糕的例子。关于传递符号进行匹配的注释是一般性注释,应该在单一资源部分之外。

    确实如果单机尝试,在启动Rails或运行rake routes时会报如下错误:

    rake routes
    rake aborted!
    missing :controller
    

    因此,您必须添加一个 :controller 选项才能在资源声明之外工作:

    get 'profile', to: :show, controller: 'users'
    

    他们指定的语法在 resourcesresource 声明中有效,例如:

    resources :user do
      collection do
        get 'profile', to: :show
      end
    end
    

    resource :user do
      get 'profile', to: :show
    end
    

    但是,这两个示例都生成了与前一个示例不同的路由。再说一次,我认为评论放错地方了。

    【讨论】:

    • 看来get 'profile', to: 'users#show', controller: 'users'这一行应该是get 'profile', to: :show, controller: 'users'。如果我们以第一种方式编写该行,controller 选项将无效。
    【解决方案2】:

    它好像不知道……

    #config/routes.rb
    
    get 'profile', to: :show
    

    从控制台:

    $ rake routes
    rake aborted
    missing :controller
    

    第一个例子:'users#show',确实创建了一个成功的路由,就像这样做

    get 'profile', to: :show, controller: 'users'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-12
      • 2020-02-07
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多