【发布时间】:2012-02-24 17:40:43
【问题描述】:
对于我的项目,我需要自定义 url,这些 url 应该不容易猜到,因为它是随着对象的整数 id 的增加而增加的。为了解决这个问题,我给我的对象一个 unique_id 属性,它是一个字符串,并编写了 resources :objects 自己生成的七个动作,如下所示:
get '/objects' => 'objects#index', as: :objects
post '/objects' => 'objects#create'
get '/objects/new' => 'objects#new', as: :new_object
get '/:unique_id/edit' => 'objects#edit', as: :edit_object
get '/:unique_id' => 'objects#show', as: :object
put '/:unique_id' => 'objects#update'
delete '/:unique_id' => 'objects#destroy'
一切都很好,我只需要告诉控制器通过Object.find_by_unique_id(params[:unique_id])而不是Object.find(params[:id])找到对象
我可以完美地创建、阅读和删除,但我无法更新。
当我打开 edit_object_path 时,它会正确呈现表单,但是当我单击“更新对象”时,它会搞砸。
从 WEBrick 输出我可以看到它创建了一个 PUT 请求,但它请求对象的 id 而不是 unique_id。例如,不是请求PUT /osefushe7398hr9,而是声明PUT /26。 update 方法甚至没有被调用,而是要求创建一个 unique_id 为 26 的新对象。
我真的不知道在哪里更改该行为或如何传递 unique_id 而不是 id。
【问题讨论】:
-
你是否更改了form_for的url?,我认为这是问题所在。尝试 form_for @object, url => {update_object_path(@object.unique_id)} 并编辑要放置的更新路线 '/:unique_id' => 'objects#update', :as => :update_object
-
另外,看看这个截屏视频railscasts.com/episodes/…
标签: ruby-on-rails rest routing