2011-03-31 33 views
9

使用Rails 2.3.5,Ruby 1.8.7。Rails:使''顯示'視圖'和'編輯'視圖匹配

是否有任何插件可以使我的「顯示」和「編輯」和「新」頁面具有相同的外觀和感覺更容易?我很樂意能夠做到以下類型的事情。現在,如果我在模型中添加一個字段,我必須將其添加到edit.html.erb和view.html.erb。我想能夠相當廣泛地指定外觀,但我希望「編輯」和「顯示」看起來相同(兩者之間可能存在異議,但可能不多)。

是否有任何DRY工具用於這個?

從本質上講,我希望能夠讓我的 「edit.html.erb」 是:

<% plugin_form_helper_for @model do |form_helper| %> 
    <%= render :partial => 'common_look', :locals => {:helper => form_helper} %> 
<% end %> 

和show.html.erb是:

<% plugin_show_helper_for @model do |show_helper| %> 
    <%= render :partial => 'common_look', :locals => {:helper => show_helper} %> 
<% end %> 

然後「form_helper」和「show_helper」將實現相同的接口(有一些分支能夠在兩者的佈局/外觀之間做出細微差異)。

回答

0

將該片段包含在_form.html.erb中,然後調用它在一個 常見的部分像show.html.erb

然後在你的控制器,點顯示和編輯到相同的部分(show.html.erb)或類似的東西。

+0

我不想「秀」,以顯示輸入字段,我想「秀」呈現的字段正確的版本作爲文本。我只想要字段列表,它們的順序,它們包含的div等等是相同的。 – 2011-03-31 18:56:53

+0

我同意托馬斯。你有沒有找到一個好的解決方案呢?我想要的是你要求的同樣的東西! – MattSlay 2012-08-17 03:46:30

2

我按照自定義輸入/顯示幫助程序函數的描述進行操作。對於一個簡單的例子,你可以有你這樣調用一個函數:

<%= my_field_helper(:model, :field_name) %> 

而在你的控制器,你@context變量設置爲:show:edit。該助手代碼包含@context一個開關,如果它是:edit,它輸出類似

<li> 
    <label>Translation of Field</label> 
    <input name="model[field_name]" value="???" /> 
</li> 

(可能使用在所有的控制器的通用@model變量,所以相同的功能,可以在所有的頁面中使用 - 或通過@my_model函數本身),但是當@context:show(或者默認情況下),其輸出是這樣的:

<li> 
    <span class="label">Translation of Field</label> 
    <span class="value">Field Value</span> 
</li> 

所以,現在你可以使用完全相同的代碼,以顯示你所有的領域!你可能想把這些代碼放到一個局部區域中,這樣你就可以很容易地將它封裝在一個可編輯的表單中,但不能用於顯示,但是關鍵的一點是完成的 - 如果你需要添加/移動/刪除字段,只有一個地方你必須這樣做。

希望這會有所幫助!

+0

這是可行的,但它在ApplicationHelper中添加了許多方法,所有這些方法都分支在@context的值上。當行爲經常在單個變量上分支時,在我看來,您想要使用相同的接口將它們分成兩個不同的類。當然,如果我自己實現它,我將自己實現它... – 2011-03-31 19:20:04

+0

@Thomas - 這不是一個壞主意。就像控制器中的'@renderer = ShowRenderer.new(@my_model)',然後在視圖中使用'<%= @ renderer.field(:field_name)%>'...我喜歡它! – 2011-03-31 19:49:58

+0

我不會在控制器中包含它。相反,我會「展示」創建「ShowRenderer」。這就是我在我的原始代碼片段 - plugin_show_helper_for @model {| helper | ...}將創建ShowRenderer並將其傳遞給該塊。 (我稱它爲'助手',但我們將其稱爲渲染器。)通常,控制器不應該有知道渲染器的任何代碼。 (例如,您是否想爲XML輸出創建相同的@renderer?) – 2011-03-31 19:55:15

3

有一個插件!

https://github.com/codez/dry_crud

這是非常靈活..只要確保你使用的鋼軌2.3

+0

我不清楚這對我有什麼幫助,但我會深入研究。頂層的例子是關於幾個控制器的概括,這不是我想要的。我希望「show」視圖和「edit/new」窗體視圖對於特定的控制器來說看起來是相同的,而且佈局相當複雜。由於歷史原因,我一次處理數百個字段,並通過標籤將它們分組。 – 2011-04-08 14:41:21