На первой полосе моего сайта объяснения лирики рэпа существует место, где пользователи могут попытаться объяснить сложную строку:
сопроводительный текст http://dl.dropbox.com/u/2792776/screenshots/2010-02-06_1620.png
Вот частичное, которое я использую для генерации этого:
<%= song_link(annotation.song, :class => :title) %>
<%= annotation.referent.strip.gsub(/\n/, "\n
") %>
<% 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 %>
<%= f.text_area :body, :rows => 4, :style => 'width:96%', :example_text => "Enter your explanation" %>
<% 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;' %>
<% end %>
Однако помещение больше чем одного из них на единственной странице проблематично, потому что направляющие автоматически дают каждой форме идентификатор new_feedback
, и каждое поле идентификатор как feedback_body
(ведущий к коллизиям имени)
Очевидно, я мог добавить что-то как :id => ''
к форме и всем ее полям, но это кажется немного повторяющимся. Что лучший способ состоит в том, чтобы сделать это?
У меня была такая же проблема на сайте, над которым я сейчас работаю и пошел с решением, которое вы упомянули внизу. Это не будет повторяться, если вы создадите идентификатор программно и поместите всю форму в частичную. Например, на моем сайте у меня есть несколько «записей» на странице, каждая из которых имеет две формы для голосования: одну для голосования за и одну для голосования против. Идентификатор записи для каждой записи добавляется к идентификатору DOM ее форм голосования, чтобы сделать ее уникальной, вот так (просто показывает кнопку голосования вверх, кнопка голосования вниз аналогична):
<% 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 -%>
Учитывали ли вы вложенные_атрибуты для моделей рельсов? Вместо того, чтобы иметь несколько новых
форм обратной связи, каждая из которых привязана к аннотации, вы можете иметь несколько форм аннотаций 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