2010-02-06 5 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, а каждое поле идентификатора, как feedback_body (ведущий т o name collisions)

Очевидно, что я мог бы добавить что-то вроде :id => '' к форме и всем ее полям, но это кажется чересчур повторяющимся. Каков наилучший способ сделать это?

ответ

3

У меня была такая же проблема на сайте, на котором я сейчас работаю, и пошел с решением, которое вы упомянули внизу. Это не повторяется, если вы программно генерируете идентификатор и помещаете всю форму в частичную. Например, на моем сайте у меня есть несколько «записей» на странице, каждая из которых имеет две формы голосования, одну для голосования и одну для голосования. Идентификатор записи для каждой записи добавляются к 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

6

вы считаете ли nested_attributes для моделей рельсов? Вместо того, чтобы иметь несколько форм обратной связи new, где каждая привязана к аннотации, вы можете иметь несколько аннотаций edit, где каждая аннотация содержит поля для новой обратной связи. Идентификаторы сгенерированных форм будут включать в себя идентификатор аннотаций, такой как 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_' вместо 'address_' для второй формы одной и той же модели. Когда вы читаете параметры формы, вы можете создать модель адреса для ввода значений.

7

Если вы не хотите, чтобы изменить названия входов или структуру модели, вы можно использовать id вариант, чтобы сделать вашу форму ID уникальный и возможность namespace, чтобы сделать ваш вход уникальные идентификаторы:

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

Таким образом, наша форма ID является уникальным, т.е. annotation_2_feedback, и это также добавит префикс, например. annotation_2_, каждому входу, созданному через f.

+0

О, мужчина, спасибо за подсказку «namespace»! – elsurudo

Смежные вопросы