2010-02-06 79 views
7

同一型號在我rap lyrics explanation site的頭版多種形式,有一個地方,用戶可以嘗試解釋一個具有挑戰性的線路:在單個頁面

alt text http://dl.dropbox.com/u/2792776/screenshots/2010-02-06_1620.png

這裏的部分我用它來生成這個:

<div class="stand_alone annotation" data-id="<%= annotation.id %>"> 
    <%= song_link(annotation.song, :class => :title) %> 

    <span class="needs_exegesis"><%= annotation.referent.strip.gsub(/\n/, "\n <br />") %></span> 

    <% form_for Feedback.new(:annotation_id => annotation.id, :created_by_id => current_user.try(:id), :email_address => current_user.try(:email)), :url => feedback_index_path, :live_validations => true do |f| %> 
    <%= f.hidden_field :annotation_id %> 
    <%= f.hidden_field :created_by_id %> 
    <p style="margin-top: 1em"> 
     <%= f.text_area :body, :rows => 4, :style => 'width:96%', :example_text => "Enter your explanation" %> 
    </p> 
    <p> 
     <% if current_user %> 
     <%= f.hidden_field :email_address %> 
     <% else %> 
     <%= f.text_field :email_address, :example_text => "Your email address" %> 
     <% end %> 
     <%= f.submit "Submit", :class => :button, :style => 'margin-left: .1em;' %> 
    </p> 
    <% end %> 
</div> 

然而,將這些一個以上的在單頁上是有問題的,因爲導軌自動給出各自形成的new_feedback的ID,並且每個字段的ID等feedback_body(導致噸o名稱衝突)

很明顯,我可以在窗體及其所有字段中添加諸如:id => ''之類的內容,但這似乎有點重複。什麼是最好的方法來做到這一點?

回答

3

我對我目前工作的網站同樣的問題,並與你提到的在底部的解決方案去了。如果以編程方式生成標識並將整個表單部分放入,則不會重複。舉例來說,在我的網站,我有多個「條目」每頁,每一個有兩個投票形式,一種投票起來,一個否決。每個條目記錄ID添加到其投票形式的DOM ID,使其獨特的,像這樣(只顯示投票向上按鈕,投票向下按鈕類似):

<% form_for [entry, Vote.new], :html => { :id => 'new_up_vote_' + entry.id.to_s } do |f| -%> 
    <%= f.hidden_field :up_vote, :value => 1, :id => 'vote_up_vote_' + entry.id.to_s %> 
    <%= image_submit_tag('/images/icon_vote_up.png', :id => 'vote_up_vote_submit' + entry.id.to_s, :class => 'vote-button vote-up-button') %> 
<% end -%> 
+0

工作我猜,但不是很高尚 – brittohalloran 2011-12-03 05:48:47

6

你考慮nested_attributes對於導軌模型?而不必每個被綁定到多個註釋反饋new形式的,你可以有多個edit註釋的形式,其中每個註釋包括一個新的反饋字段。生成的表單的ID將包含註釋標識,例如edit_annotation_16

註釋模型將有其反饋的關係,也將接受他們的嵌套屬性。

class Annotation < ActiveRecord::Base 
    has_many :feedbacks 
    accepts_nested_attributes_for :feedbacks 
end 

class Feedback < ActiveRecord::Base 
    belongs_to :annotation 
end 

然後,您可以根據需要添加任意數量的表單,每個註釋一個。例如,這是我的嘗試:

<% form_for @a do |form| %> 
    Lyrics: <br /> 
    <%= form.text_field :lyrics %><br /> 
    <% form.fields_for :feedbacks do |feedback| %> 
     Feedback: <br/> 
     <%= feedback.text_field :response %><br /> 
    <% end %> 
    <%= form.submit "Submit" %> 
<% end %> 

<% form_for @b do |form| %> 
    Lyrics: <br /> 
    <%= form.text_field :lyrics %><br /> 
    <% form.fields_for :feedbacks do |feedback| %> 
     Feedback: <br/> 
     <%= feedback.text_field :response %><br /> 
    <% end %> 
    <%= form.submit "Submit" %> 
<% end %> 

和快速和骯髒的控制器上面編輯觀點:

class AnnotationsController < ApplicationController 
    def edit 
    @a = Annotation.find(1) 
    @a.feedbacks.build 
    @b = Annotation.find(2) 
    @b.feedbacks.build 
    end 

    def update 
    @annotation = Annotation.find(params[:id]) 
    @annotation.update_attributes(params[:annotation]) 
    @annotation.save! 
    render :index 
    end 
end 
2

我也有同樣的問題,但希望更可擴展的解決方案不是添加ID到每個字段。由於我們已經在使用form_for ... | f |符號的訣竅是更改模型的名稱,並獲得新的HTML ID前綴。

使用這種方法的變體:http://www.dzone.com/snippets/create-classes-runtime(我刪除了&塊的東西)

我創建一個新的模型,是模型的精確副本我想要第二個形式在同一頁上。然後使用該新模型渲染新表單。

如果第一形式是使用

@address = Address.new 

然後

create_class('AddressNew', Address) 
@address_new = AddressNew.new 

你的ID前綴將代替用於同一模型的第二形式「地址_」「address_new_」。當你閱讀表單參數時,你可以創建一個地址模型來放入值。

7

如果你不想改變你輸入名字或你的模型結構,你可以使用id選項,使您的表單ID的獨特和namespace選項,讓您輸入ID的獨特之處:

<%= form_for Feedback.new(...), 
    id: "annotation_#{annotation.id}_feedback" 
    namespace: "annotation_#{annotation.id}" do |f| %> 

這樣,我們的形式ID是唯一的,即annotation_2_feedback,並且這還將添加一個前綴,例如, annotation_2_,通過f創建的每個輸入。

+0

哦,男人,謝謝你的「命名空間」提示! – elsurudo 2017-09-18 09:07:54