我正在尝试在我的rails应用程序中设置dnamic路由。
即。
我有一个具有name属性的act模型。
名:字符串
我尝试做的是将该名称用作我的网址。
在我的路线中如果有
map.connect 'blacktie/:id', :controller => 'acts', :action => 'show', :id => 3
这需要我http://0.0.0.0:3000/blacktie
我知道我可以按照
的方式做点什么def map.controller_actions(controller, actions)
actions.each do |action|
self.send("#{controller}_#{action}", "#{controller}/#{action}", :controller => controller, :action => action)
end
只是不确定它是否可能。
答案 0 :(得分:1)
将以下内容添加到config/routes.rb
map.connect '*url', :controller => 'acts', :action => 'show_page'
然后在app/controllers/acts_controller.rb
def show_page
url = params[:url]
if Array === url
url = url.join('/')
else
url = url.to_s
end
# you now have the path in url
@act = Acts.find_by_name(url)
if @act
render :action => :show
else
redirect_to some_error_page, :status => 404
end
end
采用上述方法的一些问题。
:url
param是一个数组或字符串,具体取决于进入的路由。例如/blacktie/night
将是一个值为['blacktie', 'night']
的数组。这就是我在show_page开头加入他们的原因。因此,您的find_by_name
函数可能非常智能,并允许嵌套行为等。希望这有帮助。
... OR
将此添加到路线(位于底部):
map.connect ':name', :controller => "acts", :action => "show_page",
:requirements => {:name => /[\w|-]*/}
这告诉rails将符合要求的任何内容发送给您的处理程序。所以你的show_page将如下所示:
def show_page
@act = Acts.find_by_name(params[:name])
if @act
render :action => :show
else
redirect_to some_error_page, :status => 404
end
end
这消除了一些陷阱,但为嵌套等提供了更少的选择。