2012-02-24 78 views
1

我的項目,我需要有一個不應該很容易猜到,因爲它是隨對象整數ID的自定義網址。爲了解決這個問題,我給我的對象UNIQUE_ID屬性,它是一個字符串,通過resources :objects寫道,將產生的七項行動嘍,它看起來像:的Rails 3:自定義寧靜的路線:更改編輯,動作行爲

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。更新方法甚至沒有調用,而是它要求創建一個unique_id爲26的新對象。

我真的不知道在哪裏更改該行爲或如何傳遞unique_id而不是id。

+0

你有沒有改變的form_for的網址?我想這就是問題所在。試試form_for @object,url => {update_object_path(@object。unique_id)}並編輯要更新的路由'/:unique_id'=>'objects#update',:as =>:update_object – mohamagdy 2012-02-24 17:58:28

+0

另外,看看這個截屏http://railscasts.com/episodes/314-pretty-urls-with-friendlyid?view = asciicast – mohamagdy 2012-02-24 17:59:23

回答

0

好的解決辦法是

def to_param 
    unique_id 
end 

添加到對象模型,而無需參數化或#{}語法。 我實際上發現,意外嘗試將unique_id傳遞給第二個解決方案中提到的窗體。事實證明,我不需要像解決方案2中所建議的那樣更改form_for標記。參數化是unique_id爲小寫的原因。如預期

現在一切正常(現在仍然是寧靜)

1

在一個形式,你可以告訴它明確地張貼哪個URL,並與它一起去什麼參數。例如(使用HAML和的form_tag)

= form_tag object_path(@object.unique_id), :method => :put do 

您還可以更加明確有:

= form_tag object_path(:id => @object.unique_id), :method => :put do 
+0

這很奇怪,當我使用這個方法並且點擊更新時,它似乎採用了原來的unique_id(不是以前的id),而是將其轉換爲小寫。然後嘗試使用小寫字母中的unique_id找到一個對象,該對象不存在,並且又想用小寫字母的unique_id創建一個新對象... – Isabaellchen 2012-02-24 19:56:13

3

Rails的模型有可能要重寫做到這一點的方法,叫做to_param方法。這個方法的默認行爲是返回模型實例的ID(這是我相信你試圖改變的)。

以您目前的佈局,我想折騰你所有的路由變化。在該模型中,添加:

def to_param 
    "#{unique_id.parameterize}" 
end 

所以,現在,使用正常路由,/ objects /:變量的請求將按您的需要運行。

使用參數化方法,你可以安全沒有碰到不友好的URL。

覆蓋to_param方法的一個小缺點是,現在使用Model.find方法(:edit,:update和destroy)的控制器中的其他操作都將需要更改爲Model.find_by_unique_id [如果你保持RESTful]。

+0

這實際上並不妨礙通過其對象訪問對象/: ID路徑 – Isabaellchen 2012-02-24 18:35:28