Несколько форм для той же модели на единственной странице

На первой полосе моего сайта объяснения лирики рэпа существует место, где пользователи могут попытаться объяснить сложную строку:

сопроводительный текст 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 => '' к форме и всем ее полям, но это кажется немного повторяющимся. Что лучший способ состоит в том, чтобы сделать это?

7
задан Tom Lehman 6 February 2010 в 21:39
поделиться

2 ответа

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

Учитывали ли вы вложенные_атрибуты для моделей рельсов? Вместо того, чтобы иметь несколько новых форм обратной связи, каждая из которых привязана к аннотации, вы можете иметь несколько форм аннотаций 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
6
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: