【问题标题】:Human readable URL causes a problem in Ruby on Rails人类可读的 URL 导致 Ruby on Rails 出现问题
【发布时间】:2011-03-05 09:16:39
【问题描述】:

我有一个带有“公司”模型的基本 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”)存储在数据库中?或者有什么方法可以在不将字符串保存在数据库中的情况下检索公司数据?

【问题讨论】:

    标签: ruby-on-rails url routing


    【解决方案1】:

    发送带有参数化值的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 的更多信息。

    【讨论】:

    • 有趣的解决方案。在参数的开头留下“id”很有趣。我刚刚跑了"12-american-express".to_i,它返回了12
    • 甜蜜又简单!谢谢@Björn。
    【解决方案2】:

    我认为friendly_id 更有用。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 不幸的是,“参数化”要复杂得多。它所做的不仅仅是改变空间和大小写。
      • 我知道这一点。我不知道您对公司名称有什么限制。
      【解决方案4】:

      试试 permalink_fu 插件,它可以在 rails 中创建 SEO 友好的 URL

      http://github.com/technoweenie/permalink_fu

      干杯

      同人

      【讨论】:

        【解决方案5】:

        我也建议使用friendly_id gem。 它使您可以灵活地使用永久链接 slug,还可以去除变音符号,转换为完整的 ASCII 等。 基本上,它让您的生活变得更轻松,并且您可以轻松获得“真正的”永久链接(不需要 to_param 和 id 解决方法)。

        哦,我有没有提到永久链接也是版本化的,所以你可以制作旧的过时的永久链接来重定向到当前的? :)

        【讨论】:

          猜你喜欢
          • 2011-01-09
          • 1970-01-01
          • 2012-09-03
          • 2012-06-30
          • 1970-01-01
          • 2019-09-03
          • 1970-01-01
          • 1970-01-01
          • 2015-12-15
          相关资源
          最近更新 更多