簡體   English   中英

Rails 3:自定義Restful Routes:更改Edit-Action行為

[英]Rails 3: Custom Restful Routes: Change Edit-Action behavior

對於我的項目,我需要有自定義網址,這不應該很容易猜到,因為它增加了整數ID對象。 為了解決這個問題,我給了我的對象一個unique_id屬性,這是一個字符串,並編寫了由resources :objects生成的七個動作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。

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 ]。

在表單中,您可以明確告訴它要發布到哪個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

好的解決方案是添加

def to_param
  unique_id
end

到沒有參數化的對象模型或#{}語法。 我實際上發現事故是試圖將unique_id傳遞給第二個解決方案中提到的表單。 事實證明,我沒有像解決方案二中建議的那樣更改form_for標記。 參數化是使unique_id成為小寫的原因。

現在一切都按預期工作(並且仍然很安靜)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM