Rails模型的to_param有时不会调用

时间:2015-02-22 12:53:18

标签: ruby-on-rails ruby

我现在正在使用Rails 4.1.6开展项目。我有一个奇怪的问题。我的模型的方法to_param(产品,类别)有时没有调用。我将它用于SEO友好的网址。

这是我的类别模型的to_param方法:

def to_param
  puts 'I am in Category to_param'
  "#{id}-#{title.to_slug.normalize.to_s}"
end

我使用puts来查找这个方法是否有效。所以,当我的网址看起来不错时( / categories / 39-средства-дезинфекции)我可以在服务器控制台上看到字符串'我在类别to_param'。这是正确的情况,一切都很好。

但有时我会为同一个对象设置 / categories / 39 等网址。当我查看这种情况的控制台时,我看不到来自to_param方法表单类别模型的任何打印。

这两种情况我在相同的页面,相同的视图和类别url(category_path)使用相同的帮助程序。

对于这种情况最复杂的是我无法重现此错误并且看不到任何规律性。对于相同的对象,我大多数时候都有正确的URL,但有时却不是。如果我重新启动rails服务器并使用清除缓存刷新浏览器 - 问题可能会解决,并且网址将再次正确。

在我的调试和研究期间,我找到了基类的源代码。但我看不出上述情况有任何原因。

def to_param(method_name = nil)
  if method_name.nil?
    super()
  else
    define_method :to_param do
      if (default = super()) &&
           (result = send(method_name).to_s).present? &&
             (param = result.squish.truncate(20, separator: /\s/, omission: nil).parameterize).present?
        "#{default}-#{param}"
      else
        default
      end
    end
  end
end

此外,我可以看出这个问题出现了,当我之前使用了FriendlyID,使用正则表达式清除和构建slug,现在用于babosa gem。所以,我认为问题是我的to_param 有时没有要求我的模型。

1 个答案:

答案 0 :(得分:0)

所以,我找到了这种行为的原因。现在它已经解决了!

原因是我在ActiveAdmin文件中重新定义了产品和类别的to_param:

  before_filter do
    Product.class_eval do
      def to_param
        puts "I am in admin Product to_param"
        id.to_s
      end
    end

    Category.class_eval do
      def to_param
        puts "I am in admin Category to_param"
        id.to_s
      end
    end
  end

因此,当我登录管理员面板并转到产品页面时,“bug”将出现在前端视图中。

因此,我需要从管理类中删除Product.class_eval和Category.class_eval块。