2010-10-31 40 views
5

我有我的當前項目的視圖,其做類似如下(以HAML)時生成的Rails獨特的HTML標識:使用重複的部分具有的form_for

[email protected] do |horse| 
    = render :partial => 'main/votingbox', :locals => {:horse => horse} 

中_votingbox.html。 HAML文件我有以下幾點:

%div.votingbox 
    %span.name= horse.name 
    %div.genders 
    - if horse.male 
     %img{:src => 'images/male.png', :alt => 'Male'} 
    - if horse.female 
     %img{:src => 'images/female.png', :alt => 'Female'} 
    %div.voting_form 
    = form_for(Vote.new, {:url => horse_vote_path(horse)}) do |f| 
     = f.label :comment, "Your opinion" 
     = f.text_field :comment 
     ... 
     a bunch of labels and input elements follow generated using the form helpers 

,這將產生工作代碼,但它確實產生與所有的表單元素,這使得該HTML無效,一旦votingbox部分呈現第二次相同的ID形式。

我在解決這個第一個猜測是指定一個唯一的:id來的form_for但僅適用於的form_for並沒有任何的form_for塊內的標籤生成的表單標籤。

一個明確的解決這個問題是要經過和手動定義上的form_for,我使用所有的表單元素我自己唯一的ID。這是比我所希望的更多的工作。

是否有更簡單或較清潔的方式來獲得的唯一ID格式相似的方式Rails的當前生成他們對我的所有的表單元素?

回答

1

我已經刪除了原來的答案,因爲它是完全不相干的問題的更新版本。

更新:所以現在我們知道你傳遞給form_for呼叫未保存的ActiveRecord對象,答案就變得簡單了:可以覆蓋form_for產生的任何參數。這包括元素ID。 fields_for爲特定記錄設置上下文。

= form_for(Vote.new, :url => horse_vote_path(horse), :id => dom_id(horse, 'vote')) do |f| 
    = f.fields_for horse, :index => horse do |fh| 
    = fh.text_field :whatever 
    … 
+0

get_vote在這種情況下總是會返回'Vote.new'這將是一個未保存的ActiveRecord對象。我已經修改了原來的問題。 這裏最理想的是如果我可以根據馬物體的id生成表單id。在這種情況下,表單的id將是'vote_new_1',用於爲id爲1的Horse對象呈現該部分。 – cyberkni 2010-10-31 19:04:18

+0

我已更新答案,請參閱。 – edgerunner 2010-10-31 19:58:49

+1

我可以建議:':id => dom_id(馬,'投票')'generetate'horse_123_vote'。它更容易閱讀。 – Ariejan 2010-10-31 20:53:39

1

您可以覆蓋自動生成id S和name一切都form_for內容與:as類似如下:

= form_for(Vote.new, :as => horse.name, {:url => horse_vote_path(horse)}) do |f| 
    = f.label :comment, "Your opinion" 
    = f.text_field :comment 

所以如果一個給定的horse.namefoobar,它會生成一個註釋字段,其idfoobar_comment和名稱是foobar[comment]

但要記住,以確保ŧ動態參數可接受爲html標識,horse.namehor$e不可接受爲html標識,因此可能會破壞某些內容。

P.S:很抱歉回答很晚,但是當時問了這個問題,我還沒有學到任何關於軌道的知識!希望可以幫助那裏的人!