【问题标题】:Stop Rails checking for params in URL?停止 Rails 检查 URL 中的参数?
【发布时间】:2013-04-09 22:27:38
【问题描述】:

应用概念:

我目前正在构建一个 Ruby on Rails [3.2] 应用程序,它由 2 个非常基本的控制器组成 - 用于用户身份验证的 accounts 和属于帐户的 messages

# app/models/account.rb
class Account < ActiveRecord::Base
  has_many :messages
end

# app/models/message.rb
class Message < ActiveRecord::Base
  belongs_to :accounts
end

然后,我粗略地设置我的routes.rb 以允许用户查看嵌套在帐户下的消息:

# config/routes.rb
resources :accounts do
  resources :messages
end

问题:

我希望用户无需在 URL 中使用 ID 参数即可访问他们的帐户,如下所示:example.com/accounts/,它工作得非常好。

每当我尝试访问:example.com/accounts/messages 但是,rails 将“消息”视为accounts_controller 的参数!我现在可以访问消息的唯一方法是:/accounts/5236/messages - 这不是我想要的。

我的问题是,有没有办法阻止/屏蔽 rails 检查我的帐户控制器上的参数,以便我可以像上面的示例一样访问我的消息?我真的对这个感到困惑,所以请分享您的想法和想法!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.2 routes params nested


    【解决方案1】:

    您定义的路线

    resources :accounts do
      resources :messages
    end
    

    暗示你只能有这样的网址:

    /accounts/
    /accounts/:id
    /accounts/:id/:action
    /accounts/:id/messages/
    /accounts/:id/messages/:id
    /accounts/:id/messages/:id/:action
    

    如果你想指定 URL /accounts/messages/,你必须在路由中指定它

    resources :accounts, :collection => { :messages => :get } do
      resource :messages
    end
    

    【讨论】:

    • 您好。不,谢谢!它似乎仍在将我带到帐户的显示操作中。
    • get "/accounts/messages" =&gt; "messages#index", :as =&gt; :message 有效,但肯定有更有效的方法吗?
    • 更新你的第一篇文章并打印一个rake routes命令(在我说的:collection之前和之后),它会有所帮助。
    • @AdamMcArthur 您的get 解决方案将起作用,并且与任何其他解决方案一样有效。我刚刚发现我的解决方案在代码清晰方面更好。
    • 那我就解决了。感谢您的帮助:)
    【解决方案2】:

    为了解决这个问题,我决定在我的routes.rb 文件中使用这个解决方案:

    get "/accounts/messages" => "messages#index", :as => :message
    

    这很好用,但唯一的缺点是,如果您在帐户名称空间下添加控制器,则每次都必须手动添加。哦,好吧。

    ForgetTheNorm 下面还有一个很棒的替代解决方案,如果这对您不起作用,请试一试!

    【讨论】:

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