Ruby on Rails:在Show中显示会员的姓名而不是ID

时间:2012-10-14 23:55:19

标签: ruby-on-rails model-view-controller routes ruby-on-rails-3.2 custom-url

  

可能重复:
  making a pretty url via ruby

我环顾四周但找不到答案。我或者要么没有问正确的问题和/或我找不到合适的地方。

我有以下定义:

config/routes.rb
resources :members

members_controller.rb
def show
@member = Member.find(params[:id])
end

截至目前,在展示会员时,网址为http://myapp.tld/members/1。让我们说会员的名字是cooldude。如果可能,显示http://myapp.tld/members/cooldude甚至http://myapp.tld/cooldude会有多难?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

我建议使用friendly_id,但如果你想推出自己的解决方案,这应该可以让你开始:

  1. 向您的模型添加slug字段
  2. 保存前设置slug字段
  3. 覆盖模型中的to_param以返回slug而不是id
  4. 设置模型:

    # member.rb
    before_save do
      self.slug = name.parameterize
    end
    
    def to_param
      slug
    end
    

    将您的取景器更改为:

    # members_controller.rb
    def show
      @member = Member.find_by_name!(params[:id])
    end
    

    请注意,find_by_name!(请参阅bang?)会引发ActiveRecord::RecordNotFound例外,而不是返回nil。在制作中,这将自动显示404页面。

    在您的观看次数中,您可以使用现在返回member_path(@member)代替/members/cool-dude的{​​{1}}。

    查看文档: