【问题标题】:Question about URL friendly links关于 URL 友好链接的问题
【发布时间】:2011-04-19 14:49:05
【问题描述】:

我试图让我的网址看起来像这样:

example.com/posts/id_of_post/title_of_post

我的控制器中有这个:

match ':controller/:id/:link', :controller => 'posts', :action => 'show'

假设我有一个帖子列表.. 我如何链接到它们?

<%= link_to 'Show', post %>

只给出通常的 /posts/id

另一方面,在创建帖子并将其存储在数据库中时,我正在制作一个对 url 友好的链接。动态创建会更好吗?这可能/更好吗?

我在另一个问题的回答中看到了这一点:

def to_param
  normalized_name = title.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
  "#{self.id}-#{normalized_name}"
end

如果我可以将 - 更改为 / 就可以了。可能吗?

【问题讨论】:

    标签: ruby-on-rails url routes


    【解决方案1】:

    我建议只这样做而不是 gsub 的东西:

    def to_param
      "#{self.id}-#{title.parameterize}"
    end
    

    缺点是如果标题改变,URL 也会改变。这是一个令人沮丧的。

    所以很多实现都可以

    before_create :permanize
    
    def permanize
      permalink = title.parameterize
    end
    
    def to_param
      "#{self.id}-#{permalink}"
    end
    

    【讨论】:

    • 在 id 和永久链接之间有没有用“/”而不是“-”来做到这一点? '%2f% 在您翻转时显示一个 '/',但是当您单击它时它会变为 '%2f' 并且不起作用。无论如何在 Firefox 中..
    • 不,不使用 to_params。你想要的是匹配 ':controller/:id/:link', :controller => 'posts', :action => 'show', :as=>:post_link ...... @post.permaname"%>
    • 有没有办法用参数化定义长度?
    • 不,您需要使用另一种 ruby​​ 方法来仅获取参数化返回的前 n 个字符
    【解决方案2】:

    这就是我所做的:

    我将此添加到我的帖子#create:

    @post.link = (@post.title.parameterize)
    

    我将在发布后最多 5 分钟内为用户提供编辑标题的选项。

    我的路线:

    match "/posts/:id/:link" => "posts#show", :as => "story"
    

    还有我的帖子索引视图

    <%= link_to 'Show', story_url(post, post.link) %>
    

    【讨论】:

      猜你喜欢
      • 2010-09-28
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2021-06-30
      相关资源
      最近更新 更多