我有一个名为offer的资源。当我编辑优惠时,URL看起来像“/ offers / 1 / edit”。如何避免ID完全显示在URL中?
我希望将优惠ID存储在会话中,因为优惠操作应该是公开的。我担心是否会尝试手动在URL中输入不同的ID。这可能吗?
我想要的网址如下所示:“/ offer / edit”。
创建操作响应:渲染“编辑”。这里没有显示ID,URL只是“/ offer”,很好。
但是这个回复(渲染“编辑”)导致再次显示带有ID的URL,grrr。
有解决方法吗?
感谢您的帮助! 马克
答案 0 :(得分:1)
您可以覆盖模型中的方法to_param
def to_param
your_item.name.parameterize
end
然后路由器将生成类似“/ offers / name_of_your_item / edit”的内容。
答案 1 :(得分:0)
您可以(虽然这是一种滥用)使用资源映射而不是资源。
您可以将resource :offers
添加到routes.rb中。
这会给你这样的路线:
offers POST /offers(.:format) {:action=>"create", :controller=>"offers"}
new_offers GET /offers/new(.:format) {:action=>"new", :controller=>"offers"}
edit_offers GET /offers/edit(.:format) {:action=>"edit", :controller=>"offers"}
GET /offers(.:format) {:action=>"show", :controller=>"offers"}
PUT /offers(.:format) {:action=>"update", :controller=>"offers"}
DELETE /offers(.:format) {:action=>"destroy", :controller=>"offers"}
或者我不会使用标准的编辑映射并添加我自己的:
resources :offers, :except => [:edit, :update] do
get :edit, :on => :collection
put :update, :on => :collection
end
如果我的记忆正确,那么以下内容应该适用于Rails 2.3.x:
map.resources :offers, :except => [:edit, :update], :collection => { :edit => :get, :update => :put }
我没有这样的环境,所以我现在无法测试它......