覆盖在Rails中生成的restful url helper

时间:2011-07-01 20:56:57

标签: ruby-on-rails ruby ruby-on-rails-3 helpers

假设我有一个Page资源,一个特定的实例有id = 5和permalink = foobar。

使用resources :pages我可以使用<%= link_to @page.title, @page %>输出网址“/ pages / 5”。

我如何输出“/ pages / foobar”而不是?与编辑网址相同...如何使edit_page_path(@page)输出“/ pages / foobar / edit”?

更新

到目前为止,答案已经覆盖了Page.rb中的to_param,这是一个很好的开始。每个+1。但是如果我希望<%=link_to @page.title, @page%>输出“/:permalink”而不是“/ pages /:permalink”呢?我会接受那个答案。

3 个答案:

答案 0 :(得分:3)

您可以覆盖模型中的to_param方法,该方法将告诉Rails使用什么而不是主键进行路由。

例如

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

参数化调用使您的标题网址友好,您可能还会注意到self.id的使用,如果您有重复的标题,建议使用此方法。

答案 1 :(得分:2)

您需要覆盖模型中的to_param方法以返回所需的字段。 Here's a blog post with some examples

答案 2 :(得分:1)

您想要使用固定链接。

将此添加到您的模型中:

class Post 

    def to_param
        "#{id}-{title}"
    end

end 

这假设您有一个标题。

一旦你得到这个,你想看起来permalink-fu,或者实际上很简单,你可以通过保存来实现自己的目标:

课程帖子

before_save :manage_peramlink

def manage_peramlink
    permalink = "#{name.gsub(/\s/, '_').gsub(/[^\w-]/, '').downcase}"
end

def to_param
    "permalink"
end

确保将peramlink作为字段添加到模型中。