如何在rails中使用动态属性进行路由生成?

时间:2015-02-03 17:27:21

标签: ruby-on-rails ruby-on-rails-4 activerecord

在我的模型中,我有这种自定义方法:

def encoded_id
    "foo#{self.id.to_s}"
end

现在,在调用mymodel_path(myobject)时,我希望方法mymodel_path接收encoded_id作为属性的一部分(例如。{id: 123, bar: 'bar', encoded_id: 'foo123'})。

如何实现不必在方法调用本身上指定它?

2 个答案:

答案 0 :(得分:1)

查找http://apidock.com/rails/ActiveRecord/Base/to_param

之类的内容

如下所示,您可以在模型中覆盖to_param方法,例如:

def to_param
  # some other value
end

当您将对象传递给url helper时,会调用它。 Helper在模型上调用.to_param并将其传递给生成的url params

答案 1 :(得分:0)

您应该创建一个帮助您执行此操作的辅助方法。

对于您的示例:mymodel_path(myobject),帮助程序mymodel_path()不是模型方法,而是url帮助程序。如果你不喜欢它的功能,你应该写另一个url helper。

def my_model_path_with_encoded_thing(model)
  mymodel_path({
    id: model.id, 
    bar: model.bar, 
    encoded_id: model.encoded_id
  }) if model.persisted?
end

如果你真的想和mymodel_path(object)呆在一起,你可能会使用params,但它会破坏嵌套路由并试图将普通参数传递给url helper:

def to_param
  "#{self.id}?foo=#{self.foo}&encoded_id=#{self.encoded_id}"
end