如何在URL中使用Rails资源的另一个属性?

时间:2012-10-22 05:55:44

标签: ruby-on-rails ruby url activerecord

我正在尝试关注http://railscasts.com/episodes/63-model-name-in-url以获得如下所示的网址:

/dog/<custom field of dog>

而不是

/dog/1

其中“1”是Dogs表的内部主键。我想要的自定义字段恰好是Dogs字段中的另一个整数。

我的代码:

dogs_controller.rb:

load_and_authorize_resource :except => [:index]    
def show
       Rails.logger.info("Hello")
       @dog = Dog.find_by_custom_field(params[:id])
    end

dog.rb:

def to_param
    custom_field
end

特别是,当我尝试加载/dogs/<custom_field>时,它仍然坚持使用该整数作为主键查找,而不是查找自定义字段。所以我得到了Couldn't find Dog with id=<custom_field>。错误

有趣的是,当我尝试这样做时,记录器行也永远不会被打印出来。但是,当我删除load_and_authorize_resource(CanCan)行时,它会起作用。这是怎么回事?

1 个答案:

答案 0 :(得分:2)

使用id传递以外的其他属性:find_by选项

 load_and_authorize_resource :except => [:index]  , :find_by => :custom # will use find_by_custom!(params[:id])

有关控制器方法的更多信息,请参阅cancan手册 http://rdoc.info/github/ryanb/cancan/master/CanCan/ControllerAdditions/ClassMethods