2011-11-18 52 views
0

我的代碼在我的觀點如下位:分享部分不同資源之間

- if admin? 
    .meta 
    Administrator options: 
    = link_to 'Edit This Post', edit_post_path(@post) 
    | 
    = link_to 'Delete This Post', @post, :method => 'delete', :confirm => 'Are you sure?' 

我發現我使用相同的基本片段很多,但有時有不同的資源,有時甚至超過一個頁面上的資源。我想提取這部分幹到它,但我需要寫是因爲它可以與本地或實例變量適用於任何模型。例如,我需要它來處理:

@post, post, @page, page 

你是如何做到這一點的?

+0

寫的部分和向它傳遞參數,將不是解決你的問題?只是谷歌傳遞參數,你應該沒問題 – aishwarya

+0

真正的問題是路由助手,你怎麼做一個通用的「編輯這個」鏈接而不知道型號名稱? – Andrew

回答

1

你可以清晰地寫你的部分是獨立的給定對象:

- if admin? 
    .meta 
    Administrator options: 
    = link_to 'Edit', [:edit, object] 
    | 
    = link_to 'Delete', object, :method => 'delete', :confirm => 'Are you sure?' 

然後你就可以做類似

render :partial => 'shared/admin_link', :locals => { :object => @post } 
+0

'= link_to'編輯',[:編輯,對象]'輝煌!這是記錄在某處嗎?這正是我一直在尋找的。 – Andrew

+0

我再也找不到任何「官方」文檔了,但[在這裏](http://apidock.com/rails/ActionView/Helpers/UrlHelper/url_for)在評論中提到它。 – nathanvda

1

可以使用在render方法:object:collection選項提交一個變量的部分。 :object選項將單個對象傳遞給可包含任何內容的部分。 :collection選項用於傳遞必須來自相同的Class的對象數組。

例如你有你的@post並將其傳遞給部分這樣

<%= render :partial => 'layouts/my_partial', :object => @post, :as => :my_local_var %> 

然後你就可以通過調用部分my_local_var訪問對象。使用:collection稍有不同,但您可以在此自行閱讀:http://guides.rubyonrails.org/layouts_and_rendering.html

A由於路由名稱,問題將是不同類中的一個部分的使用。那麼你不能使用edit_modelname_path(@instance_var)你必須在link_to方法中使用路由Hash { :controller => params[:controller], :action => 'edit' }

//對於鏈接創建wihout params[:controller]

它只是一個想法,我沒有之前這樣做,但你可以試試這個,例如:

您呈現的部分,並使用:object => @instancevar, :as => :my_local_var你可以使用下面的行動態鏈接創建:

<%= link_to "link text", { :controller => my_local_var.class.to_s.pluralize.downcase, :action => 'edit', :id => my_local_var.id } %> 

然後你不依賴於params[:controller]但可以鏈接到瓦爾編輯鏈接。

+0

這是有幫助的,謝謝!你能想到一種創建編輯鏈接而不依賴於控制器參數的方法嗎?我可能希望在同一屏幕上的多個不同模型的主頁上有這種鏈接,但這些鏈接都不會對應於當前正在渲染視圖的控制器。如果你有一個想法如何從給定的模型實例推斷出編輯鏈接,那太棒了! – Andrew

+0

查看帖子更新 – davidb

+0

謝謝David,這非常有幫助。 – Andrew