Rails 动态定义路由

ane · November 17, 2014 · Last by saiga replied at November 19, 2014 · 2320 hits

本着大胆假设,小心求证的路线。

假如有这样的一个需求,就一个静态页面,页面有个表单,理论上的做法就是建 controller,model balbalbal.

但是这样的需求一个接一个出现,而且彼此都是毫无关联的,于是就想做成一个动态的功能,直接将 HTML 页面存起来,表单数据存

mongo 里。

但是,路由似乎还是一个需要程序员去写。若采用程序写入路由的方式,你还得需要重新加载一次 application。

so, 类似这样的需求有什么经验之谈?

最后,楼主 采用了 1,2 楼的建议,写了这样的路由

get 'auto/:kind/page' => 'pages#show'

但是为了满足市场的需求(要求 URL 是 xxx.com/market/mic),又不得不暂时加入这样一条路由 get 'market/mic', controller: :pages, action: :show, kind: :mic

controller 中采用 Mongo.find_by_kind(params[:kind]).view的写法。而view中就存储了HTML代片

但是撸主依然想找一个好方法,去实现这样的需求,

至少将 get 'market/mic', controller: :pages, action: :show, kind: :mic 这样的

路由美化一下也是极好的。若是能提出更好改良方案,那便更是不负恩泽了。

http://guides.rubyonrails.org/routing.html get '*path' => 'pages#unknown' 这个勉强符合需求,更好的我自己也没有发现. 例如我新建了一个 about 页面,在 page 这个 model 里面,那么我想他的路由是 pages/about,在 unknown action 里面我查找 about 这个关键字,返回 page model.

# routes.rb
get '*path' => 'pages#unknown'

# page_controller.rb
class PageController < ApplicationController
  def unknown
    @element = find_by_title(params[:path])
  end
end

http://stackoverflow.com/questions/18481458/dynamic-routes-on-runtime-in-rails

交由控制器去处理就行了

get /*path to: 'page#show'

#2 楼 @_samqiu #1 楼 @flowerwrong 两位这样写,当然是可以滴,可是两位都有一个共同点,就是必须所有的页面都有一个统一的 URL 格式,也就是说可以用一个正则写出来,但我面对的问题确实,URL 是未知的,

get '*path1/*path2/*path3' => 'pages#unknown' 我确实没有更好的解决办法了

直接丢 public 下去?

#3 楼 @ane 可以想办法把所有的 path 写到数据库里

https://github.com/thoughtbot/high_voltage 试试看用这个插件来写这些固定页面

你这个所谓的静态页面 表单是一样的?只是 url 不一样?

#8 楼 @steven_yue NO,全都不一样

#7 楼 @foxzool 它不是一个固定页面,是一个和系统没有关系的,比如广告插播之类的页面。所以不想每次这样的需求就去写个 MVC。

同 6 楼.. comfortable-mexican-sofa 这个 cms 也是这么处理的,page 表里面存字段 full_path,路由这样定义:

get '/:format' => 'content#show', :as => 'render_page', :path => "(*cms_path)"

然后在控制器里面整个 url 一起查:

@cms_page = @cms_site.pages.published.find_by_full_path!("/#{params[:cms_path]}")
You need to Sign in before reply, if you don't have an account, please Sign up first.