Homeland 大家觉得有必要为节点增加 slug 功能吗?

kevinhua · 2012年04月06日 · 最后由 doitian 回复于 2012年04月07日 · 2510 次阅读

views/cpanel/node视图和model/node.rb模型中分别添加f.slugfield :slug后,再在 topic.rb 模型中 cache node_slug,就可以通过修改 routes 来 cheat 了:

{"movies" => 1, "books" => 2, "music" => 3}.each do |slug, id|
  match "#{slug}" => "topics#node", :as => "#{slug}".to_sym, :id => id
  match "#{slug}/new" => "topics#new", :as => "new_#{slug}".to_sym, :node_id => id
end


以及 feed 的 routs:

{"movies" => 1, "books" => 2, "music" => 3}.each do |slug, id|
  match "#{slug}/feed" => "topics#node_feed", :as => "feed_#{slug}".to_sym, :id => id
end


然后,修改一下render_node_name方法

def render_node_name(name, slug)
  link_to(name, "/#{slug}" )
end


views/topics/_topic.html.erb以及views/topics/_topic_info.html.erb中调用render_node_name的参数 node_id 改为 node_slug

最后,再修改一下render_topic_node_select_tag方法:

  def render_topic_node_select_tag(topic, node_id)
    return if topic.blank?
# 我喜欢扁平式的node结构,所以取消了group_collection_select,而使用了collection_select
#    grouped_collection_select :topic, :node_id, Section.all, 
#                    :sorted_nodes, :name, :id, :name, :value => topic.node_id,
#                    :include_blank => true, :prompt => "选择节点"
     collection_select :topic, :node_id, Node.all,
                     :id, :name, :value => topic.node_id,
                     :include_blank => true, :prompt => "选择主题类型",
                     :selected => node_id 
  end


这样,就支持类似

ruby-china.org/slug

ruby-china.org/slug/new

这样的访问方式啦。

反对,占用第一层路径会对后续开发造成重名阻碍。

而且没必要用 each 生成那么多路由

#1 楼 @Rei 节点太多这样不行。我准备弃用 section,只保留十个左右的 nodes,然后就用生成 routes 这种方式来欺骗,而避免使用单表继承或多个模型这种费力的方式。

要用 slug 做 url,做成这样就行了

get '/:slug' => 'topics#node', :as => :node

调用的时候 node_path(:slug => 'xxx')

#3 楼 @Rei 那 new, edit 等动作呢?

#5 楼 @kevinhua node 应该只有后台编辑权吧,用普通的 resources 路由

#6 楼 @Rei 是指 slug/newslug/edit这样的。

#7 楼 @kevinhua 一条条指定了,resources 应该不能指定根路径和更改:id 变量名称

get '/:slug/edit' => 'node#edit', :as => :edit_node
put '/:slug' => 'node#update'



slug/new 如果 slug 是动态的话没法给 form 使用吧。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号