Добавление элемента списка на стороне клиента - PullRequest
2 голосов
/ 26 сентября 2010

Я сразу скажу, что я полный новичок в Rails, так что это может быть что-то очевидное, что я упускаю.

У меня есть веб-форма для редактирования неупорядоченного (<ul>) список вопросов.Каждый вопрос - это пункт в списке.Каждый вопрос имеет текстовое поле для текста вопроса и раскрывающийся список, чтобы указать, к какому типу вопросов это относится (множественный выбор, истина / ложь и т. Д.).

Я также хочу дать пользователю возможность добавлять новыевопросы, щелкнув ссылку и получив новое текстовое поле и раскрывающийся список, отображаются в виде элементов в списке.

Я не нашел по-настоящему чистого способа сделать это, поэтому я как-то складываю их воединоиз различных уроков.Есть ли лучший подход, который мне не хватает?

Вот код для edit.html.erb:

<h1>Editing Survey: <%= "#{@survey.name}" -%></h1>

<% form_for @survey, :url => {:action => 'update', :id => params[:id]} do |survey_form| %>
  <h2>Title: <%= survey_form.text_field :name %></h2>
  <ol class='question_list'>
  <% for @question in @survey.questions %>
    <% fields_for "question[]" do |f| %>
      <li>
      <%= f.text_field :q_text %><br>
      <%= select(:question, :q_type, { "True/False" => "T", "Multiple Choice" => "M"}) %><br>
      </li>
    <% end %>
  <% end %>
  </ol>
  <%=
    link_to_function "Add another question",
                     update_page {  |page|
                        page.insert_html :bottom, 
                        'blank_question', 
                        (render :partial => 'blank_question', :object => @question ) 
                     }

  %>
  <%= submit_tag "Update" %><br>
<% end %> <% "End of form_for" %>

<%= link_to "Back", {:action => 'list' } %>

Я создал еще один файл erb с именем _blank_question.erb, который представляет собой элементы, которые яхотел бы включить, когда они нажимают на ссылку «Добавить еще вопрос»:

<li>
  <%= text_field :question, :id, :size => 25 %><br>
  <%= select(:question, :q_type, { "True/False" => "T", "Multiple Choice" => "M"}) %><br>
</li>

Проблема заключается в том, что я получаю следующую ошибку во всплывающем окне, когда я нажимаю на ссылку «Добавить еще вопрос».

Ошибка RJS:

TypeError: Функция объекта Element () {[собственный код]} не имеет метода «вставка» [собственный код]} не имеет метода «вставка»

Немного поиска в Google не принесло никаких полезных результатов.Есть идеи, где я иду не так?

Ответы [ 3 ]

1 голос
/ 27 сентября 2010

Некоторые подсказки:

Кажется, что нет элемента blank_question, куда можно вставить визуализированный HTML. Возможно, вы захотите вставить в родительский элемент:

update_page do |page|
  page['parent'].insert_html :bottom, :partial => 'blank_question',
                                      :object => @survey.questions.build
end

Или, что еще проще, пусть Rails решит, какую часть использовать:

update_page {|page| page['parent'].insert_html :bottom, @survey.questions.build }

Это попытается использовать «_question.html.erb», передавая пустой вопрос, уже связанный с вашим опросом, в качестве локальной переменной «вопрос», плюс вы можете поделиться частями для отображения существующих и новых вопросов (см. Ниже).

Кстати: посмотрите, как вы можете напрямую пропустить вызов для рендеринга (и позволить Rails создать пустой вопрос для вашего опроса).

Другое КСТАТИ: Вы можете передать коллекцию в fields_for примерно так (и она автоматически зациклится на ней, и вы можете пропустить цикл for):

survey_form.fields_for :questions do |f|
  #...
end

Однако, это работает, только если ваш class Survey; has_many :questions. Но это, наверное, так. fields_for используемый в родительской форме также поддерживает новые объекты, которых еще нет в базе данных - это может быть полезно для вас (так называемый "blank_question"). Также вы можете просто использовать form_for @survey do |survey_form|. Rails будет достаточно умен, чтобы использовать обновление или создавать URL в зависимости от того, находится объект в базе данных или нет. Для этого Rails использует метод new_record?.

Приложение к вышеприведенному - чтобы поделиться частями, затем используйте:

survey_form.fields_for :questions {|f| render f.object }

Это выдаст «_question.html.erb» для каждого члена коллекции.

Обычно я использую помощника для рендеринга таких вложенных форм:

module SurveysHelper
  def setup_survey(s)
    # add empty question to survey if none associated
    s.questions.build unless s.questions.size > 0
    return s
  end
end

и в представлении:

form_for setup_survey(@survey) do |survey|
  survey.fields_for :questions {|f| render f.object }
end
1 голос
/ 27 сентября 2010

Если вы используете версию Rails> 2.3 (которую я рекомендую, если вы этого не сделаете), вы можете посмотреть два скринкаста:

, которая точно объясняет, что вы хотите сделать.Вторая часть посвящена Ajax-части, но я действительно рекомендую смотреть как первую, так и вторую части, потому что Ryan Bates строит это постепенно, и это действительно поможет вам многое прояснить.

Как правило, сайт Railscasts является одним из лучших способов узнать о многих простых или сложных вещах Rails.

0 голосов
/ 09 января 2014

Убедитесь, что prototype.js включен в каталог javascript вашего rails и что вы импортируете его в свой заголовок:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...