AFG*_*AFG 11 ruby ruby-on-rails
我的申请是在RoR
我有一个名为showsummary的操作/视图,其中ID已传递到URL,控制器已使用它来实例化@vendor,其中@ vendor.name是公司的名称.
我希望URL而不是showsummary/1 /在URL中具有/ vendor-name.
我怎么做?
所有这些解决方案都使用find_by_name,这肯定需要在该列上有索引并要求它们是唯一的.我们使用的更好的解决方案是牺牲少量美感,使用前缀为供应商名称及其ID.这意味着您不必在名称列上有索引和/或需要唯一性.
vendor.rb
def to_param
normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
"#{self.id}-#{normalized_name}"
end
Run Code Online (Sandbox Code Playgroud)
所以这会给你这样的网址
/ 1-Acme的
/ 19-西夫韦
等等
然后在你的节目动作中你仍然可以使用
Vendor.find(params[:id])
Run Code Online (Sandbox Code Playgroud)
因为该方法将隐式调用.to_i其参数,并且调用to_i这样的字符串将始终返回数字前缀并删除剩余的文本 - 它在该点处的所有绒毛.
以上假设您使用的是默认路由/:controller/:action/:id,这会使您的网址看起来像
商/供应商/显示/ 1- Acme的
但如果你想让他们看看
/ 1-Acme的
然后有一条路线
map.show_vendor '/:id', :controller => 'vendors', :action => 'show'
Run Code Online (Sandbox Code Playgroud)
这意味着它几乎可以吞下很多你可能不想要它的URL.引以为戒.
我以为我会提到String#parameterize,作为标记答案的补充.
def to_param
"#{id}-#{name.parameterize}"
end
Run Code Online (Sandbox Code Playgroud)
它将过滤掉带连字符的字符,用短划线替换空格等.
| 归档时间: |
|
| 查看次数: |
4215 次 |
| 最近记录: |