【问题标题】:Is there a way to check the parameters and decide the routes based on the parameters in rails?有没有办法检查参数并根据rails中的参数决定路线?
【发布时间】:2010-07-30 12:44:06
【问题描述】:

我正在寻找一种基于请求参数来决定路由的方法。例如,如果它有 params[:web],我想将请求路由到 web 控制器,如果它有 params[:iphone],我希望路由到 iPhone .是否可以这样做保持路由的名称相同,但根据参数将它们路由到不同的控制器/动作?

【问题讨论】:

  • 您似乎在错误的地方寻找东西。如果你想呈现不同的视图 - 看看用户代理。关于区分 iphone 和简单浏览器代理的教程相当多。
  • @eimantas 与用户代理我可以对整个路由进行约束,我想要的只是具有相同的命名路由,但根据参数具有不同的映射(控制器/动作)。
  • 您可能想了解“包罗万象”的控制器。另外-不要打扰大的if语句,试试case。不如重定向到param[:platform] 中提供的控制器?

标签: ruby-on-rails routes ruby-on-rails-plugins


【解决方案1】:

如果您在您的 routes.rb 文件中定义如下路由(或命名路由),则可能

map.connect '/:controller/:action/:platform',:controller => 'some controller name',:action=>'some action'

如果你在你的行动中处理这个,你可以使用像 params[:platform]

如果您对此进行更多自定义,请阅读有关命名路由的更多信息。就您的问题而言,我希望上面的代码可以解决问题

【讨论】:

  • 这个代码将指向同一个控制器,但我想在运行时决定控制器。
【解决方案2】:

扩展@lakshmanan 的答案,您可以这样做:

将此添加到您的 routes.rb:

map.named_route '/:controller/:action/:platform'

在你看来,

<%= link_to "Blah blah", named_route_path(:controller => "some_controller",
                                          :action => "some_action",
                                          :platform => "some_platform")

在你的 some_controller 中,

def some_action
   if params[:platform] == "web"
        #DO SOMETHING
   elsif params[:platform] == "iphone"
        #DO SOMETHING
   else
        #DO SOMETHING
   end
end

【讨论】:

  • 有一个错误:你想要 == "iphone" 而不是 = "iphone"。
  • 这不会解决我的目的我希望命名路由使用相同的名称但不同的控制器操作映射,因为对某些参数有某些额外的检查和处理,我不想做我的代码在同一个操作中充满了条件,响应也会相应地变化。
  • 我还是不明白你到底想要什么。可能如果你能用伪代码和一个例子来解释,那就太好了!我也同意@Eimantas 的评论,前提是您已经尝试过了,并且您确定这不是您想要的! :)
【解决方案3】:

假设有一个很好的理由让一个控制器接受此操作(如果有共享代码...将其移至辅助方法或模型,并使用用户代理信息或命名路由对您有利),检查参数并重定向到适当的控制器和操作:

def some_action 
   # some shared code here
   if params[:platform] == 'iphone'
     redirect_to :controller => 'foo', :action => 'bar'
   elsif params[:platform] == 'web'
     redirect_to :controller => 'baz', :action => 'baq'
   else
     # default controller and action here
   end
end

如果您真的希望命名路由映射到不同的控制器,则需要对平台字符串进行硬编码:

map.connect '/foo/bars/:id/iphone', :controller => 'iphone',:action=>'some_action'
map.connect '/foo/bars/:id/web', :controller => 'web',:action=>'some_action'

更新0

来自here,你可能想试试map.with_options(:conditions =&gt; ... )

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 2019-05-06
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多