Rails控制器编辑操作 - 如何避免显示id?

时间:2011-03-14 21:44:30

标签: ruby-on-rails path controller edit

我有一个名为offer的资源。当我编辑优惠时,URL看起来像“/ offers / 1 / edit”。如何避免ID完全显示在URL中?

我希望将优惠ID存储在会话中,因为优惠操作应该是公开的。我担心是否会尝试手动在URL中输入不同的ID。这可能吗?

我想要的网址如下所示:“/ offer / edit”。

创建操作响应:渲染“编辑”。这里没有显示ID,URL只是“/ offer”,很好。

但是这个回复(渲染“编辑”)导致再次显示带有ID的URL,grrr。

有解决方法吗?

感谢您的帮助! 马克

2 个答案:

答案 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 }

我没有这样的环境,所以我现在无法测试它......