停止Rails检查URL中的参数?

时间:2013-04-17 08:34:58

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

应用程序概念:

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

# 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

问题:

我希望用户无需在网址中使用ID参数即可访问自己的帐户:example.com/accounts/,效果非常好。

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

只是为这个问题添加了一些关闭,我决定在routes.rb文件中使用此解决方案:

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

这很有效,但唯一的缺点是每次如果你在轨道上的帐户命名空间下添加控制器,就必须手动添加它。哦,好吧。

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