人类可读的URL导致Ruby on Rails出现问题

时间:2010-06-18 11:03:01

标签: ruby-on-rails url routing

我有一个带有“公司”模型的基本CRUD。为了显示公司名称,我做了

def to_param
  name.parameterize
end

然后我访问了公司控制器中运行http://localhost:3000/companies/american-express操作的show

显然这不起作用,因为show方法如下:

def show
  @company = Company.find_by_id(params[:id])
end

params[:id]american-express。该字符串不存储在任何地方。

保存记录时,是否需要在数据库中存储短字符串(即“American-express”)?或者有没有办法检索公司数据而不保存数据库中的字符串?

5 个答案:

答案 0 :(得分:3)

使用参数化值发送ID;

def to_param
    new_record? ? super : "#{id}-#{name}"
end

当您在show方法中收集数据时,您可以使用整个参数;

def show
    @company = Company.find("12-american-express"); // equals to find(12)
end

还有一个名为permalink_fu的插件,您可以阅读更多关于here的内容。

答案 1 :(得分:2)

我认为friendly_id更有用。

答案 2 :(得分:0)

我在博客软件中使用Category模型执行类似操作。如果您可以保证parameterize方法对您的公司名称进行的唯一转换是用破折号替换空格字符,那么您可以简单地执行相反的操作:

def show
  @company = Company.find_by_name(params[:id].gsub(/-/, ' '))
end

答案 3 :(得分:0)

尝试permalink_fu插件,在rails中创建SEO友好的URL

http://github.com/technoweenie/permalink_fu

欢呼声

sameera

答案 4 :(得分:0)

我也会建议friendly_id宝石。 它使您可以灵活地使用持久的永久链接段,也可以剥离变音符号,转换为完整的ASCII等。 基本上它会让你的生活变得更轻松,你可以毫不费力地获得“真正的”永久链接(没有to_param和所需的id解决方法)。

哦,我是否提到永久链接也是版本化的,所以你可以将旧的过时固定链接重定向到当前版本? :)