d11*_*wtq 2 ruby ruby-on-rails
更新(再次)| 忽略我之前放在这里的模块东西。最好只使用to_param和使路线工作。
to_param
if slug
"#{id}-#{slug}"
else
super
end
end
match "/posts/:id(-:slug)" => "posts#show", :as => :post, :constraints => { :id => /\d+|\d+-.*/ }
Run Code Online (Sandbox Code Playgroud)
诀窍就在这条路上。它使-:slug可选,并向:id. 约束的偏好是只匹配一个数值(这是请求进来时使用的,所以你有:id和:slug在你的参数中),但管道允许它也匹配一个数值,后跟 slug,目的路由生成。这是一个温和的黑客,但这整件事都是真的。允许资源提供参数的散列将解决这个问题。这可以应用于您想要的任何花哨路线(例如,:id在结尾而不是开头)。
导轨 3.0.7。
走一条路线,如:
match "/posts/:id-:slug" => "posts#show", :as => :post
Run Code Online (Sandbox Code Playgroud)
这post_path(obj)为我提供了一个帮助程序,但当然,它只想从我的模型中生成一个参数,据我所知,无法从我的模型to_param方法中返回多个值。我知道我可以这样写to_param:
to_param
"#{id}-#{slug}"
end
Run Code Online (Sandbox Code Playgroud)
但这作为单个参数传递给路由,最终不匹配任何路由。同样,我知道我可以"-:slug"从我的路线中删除,但是:id参数包含虚假输入并且基本上有点黑客(尽管显然已经完成)。
如果 Rails 的未来版本允许您从 返回哈希值to_param,那就太棒了,例如:
to_param
{ :id => id, :slug => slug }
end
Run Code Online (Sandbox Code Playgroud)
然后在找到要使用的正确路线时使用这些。
我想弄清楚的是,我将在哪里覆盖post_path()以提供正确的路线。我可以把它放在一个视图助手中,但是它在我的控制器中不可用,所以我猜这是错误的地方。
只是好奇比什么都重要。我知道如果我只是:slug在路线上省略它就可以正常工作,但是在更复杂的情况下,我可以想象覆盖默认路径是一件有用的事情。能够仅通过传递资源来生成路由是我想采用的一个非常好的功能,但是营销部门总是让我们填写 URL 将各种关键字 mumbo jumbo,所以一些控制会很好:)
路由有两个方面:路由生成和路由匹配。
该线路生成,正如你所指出,是很容易的。to_param在任何 ActiveModel 中覆盖:
# In a model:
def to_param
# Use another column instead of the primary key 'id':
awesome_identifier.to_s
end
Run Code Online (Sandbox Code Playgroud)
该航线的匹配是不太明显。可以指定:awesome_identifier代替:id默认资源路由中的每个出现。然而,我发现如果你离开:id你的路线,Rails 会给你带来更少的阻力,并且只改变你的控制器中的逻辑。请注意,这是一种权衡,因为从根本上说:id,您的路线中的 并不是真正正确的。
# In a controller:
def index
@awesome_record = AwesomeModel.find_by_awesome_identifier(params[:id])
# ...
end
Run Code Online (Sandbox Code Playgroud)
正如您所指出的,Rails优化了一个用例:如果您希望将主键用于快速记录查找,但仍希望在 URL 中包含一个 slug 以方便用户或搜索引擎优化。在这种情况下,您可以"#{id}-#{whatever}"从to_param方法返回表单的字符串,当将相同的字符串送回find方法时,将忽略破折号之后的所有内容。
| 归档时间: |
|
| 查看次数: |
1001 次 |
| 最近记录: |