【发布时间】:2014-12-11 19:46:51
【问题描述】:
我已经搜索并尝试了http://guides.rubyonrails.org/routing.html 中提到的许多不同的东西,但没有一个接缝可以做我想做的事。
要点: 我有一个控制器,可以为不同的手机类型设置视图
class PhoneViewsController < ApplicationController
def android_automated
#Do Android Stuff
end
def android_interactive
#Do Android Stuff
end
def ios_automated
#Do Apple Stuff
end
def ios_interactive
#Do Apple Stuff
end
def blackberry_automated
#Do Blackberry Stuff
end
def blackberry_interactive
#Do Blackberry Stuff
end
end
上述每个方法在 phone_views 视图文件夹中都有对应的视图部分
我希望将 /android/interactive 之类的网址读取为 phone_views#android_interactive
Rails 路由的语法允许我使用诸如
之类的参数进行重定向 get 'android/:action', to: redirect('/phone_views/android_%{action}')
get 'phone_views/:action' , :controller => 'phone_views'
这会呈现正确的页面,但有一个时髦的 url 的讨厌的副作用
我尝试过将其用作:
get 'android/:mode', :to => 'phone_views#android_%{mode}'
但我得到一个动作 %{mode} not found 错误,好像它没有将 %{mode} 视为变量
get 'android/:action', :controller => 'phone_views', :action => 'android_%{action}'
导致找不到“交互式”错误操作,并且:
get 'android/:mode', :controller => 'phone_views', :action => 'android_%{mode}'
得到与上述相同的操作 %{mode} not found 错误。
在获取请求中获取命名变量(例如 :mode)并将其用于形成操作的语法是什么?
更新: 我相信我几乎想通了。这些变量似乎无法以我尝试使用它们的方式访问,但如果您将请求传递给 proc{},它们似乎是可访问的。
match 'android/:mode', to: proc{|params| action = params['action_dispatch.request.path_parameters'][:mode]; control = PhoneViewsController.new(); control.send('android_' + action)}, via: [:get]
然而,这只会导致错误 undefined method `[]' for nil:NilClass 但错误在适当的控制器中。希望这有助于解决这个问题。
【问题讨论】:
-
你试过简单的
get 'android/interactive', :to => 'phone_views#android_interactive'吗? -
是的,这确实有效,但这意味着我必须为每种可能的 android 模式输入一个条目。如果我能弄清楚访问变量的语法,我可以使这种方法更加动态。
标签: ruby-on-rails variables routing