为用户定制rails路由 - Rails 4

时间:2016-12-13 17:54:13

标签: ruby-on-rails

可以建议我如何在rails

中获取这样的URL

http://www.example.com/users/5/ian

我试过以下但不确定:

route file:
devise_for :users
  resources :users do
    resources :socials
  end
  get '/users/:id/:firstname', controller: 'users', action: 'show'

users_controller.rb

def show
    @user = User.find(params[:id], params[:firstname])
  end

3 个答案:

答案 0 :(得分:1)

尝试替换此

def show
  @user = User.find_by_id_and_firstname(params[:id], params[:firstname])
end

答案 1 :(得分:1)

如果您正在尝试完成的是“友好网址”,您可以通过以下方式完成:

# GET /users/1
# GET /users/joe
def show
  @user = User.find_by!('id = :x OR firstname = :x', x: params[:id]) 
end

但是,您必须确保您在URL中使用的属性是URL安全且唯一的。通常使用单独的用户名或slug字段。 路线方面没有什么特别之处。

这些宝石提供“友好的网址”:

答案 2 :(得分:1)

如果您正在尝试实现“友好网址”,那么我建议您使用此功能:

您无需创建特殊路线:

get '/users/:id', controller: 'users', action: 'show'

相反,您的模型会覆盖to_param方法:

class User
  ...
  def to_param
    "#{id}-#{firstname.try(:parameterize)}"
  end
  ...
end

url helper调用to_param来构建url。如果你用这种方式覆盖它,你会收到一个这样的网址:

http://localhost:3000/users/1-artloe

rails在params [:id]上找到方法调用.to_i,谢天谢地,它将字符串解释为数字,直到它到达不能成为数字的字符。

示例:

'123abcde'.to_i # 123
'123-asdf'.to_i # 123
'asdf-123'.to_i # 0

所以除了覆盖to_param之外,你不需要做任何事情。