Добавление обработчиков javascript к удаленному объекту формы после внедрения с помощью RJS - PullRequest
0 голосов
/ 30 октября 2010

У меня есть страница формы, где я хочу, чтобы пользователь мог добавить вложенные формы, нажав на удаленную ссылку («добавить фотографию», например). После нажатия на кнопку я внедряю вложенные формы с помощью RJS. Внедренные формы являются удаленными формами, но после внедрения к формам не присоединяются события javascript, поэтому они просто отправляют http в контроллер вложенного объекта. Кроме того, все отлично работает.

Мой вопрос:

Можно ли вызвать повторную проверку подлинности javascript удаленных форм через RJS после внедрения ??

Таким образом, мои вложенные формы будут правильно обрабатывать события javascript и отправлять их с помощью AJAX.

Форма моей страницы (_form.html.erb):

<% javascript 'ckeditor/ckeditor' %>

<%= form_for @page, :html => { :multipart => true } do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :active %><br />
    <%= f.check_box :active %>
  </p>
  <p>
    <%= f.label :homepage %><br />
    <%= f.check_box :homepage %>
  </p>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :description %><br />
    <%= f.text_area :description, :rows => 5, :cols => 80 %>
  </p>
  <p>
    <%= f.label :text %><br />
    <%= f.text_area :text, :class => 'html' %>
  </p>
  <p>
    <%= f.label :picture_class %><br />
    <%= f.select :picture_class, ['left','right','full'] %>
  </p>

 <% unless @page.new_record? %>
  <h2>Photos</h2>
  <%= link_to 'Add photo', add_photo_page_url(@page), :remote => true %>
  <div id="photos">
  <%= render :partial => 'shared/forms/photo', :collection => @page.photos %>
  </div>
  <h2>Snippets</h2>
  <%= link_to 'Add snippet', add_snippet_page_url(@page), :remote => true %>
  <div id="snippets">
  <%= render :partial => 'shared/forms/photo', :collection => @page.snippets %>
  </div>
  <h2>Downloads</h2>
  <%= link_to 'Add download', add_download_page_url(@page), :remote => true %>
  <div id="downloads">
  <%= render :partial => 'shared/forms/download', :collection => @page.downloads %>
  </div>
  <h2>Paragraphs</h2>
  <%= link_to 'Add paragraph', add_paragraph_page_url(@page), :remote => true %>
  <div id="paragraphs">
  <%= render :partial => 'shared/forms/paragraph', :collection => @page.paragraphs %>
  </div>
 <% end %>

  <p><%= f.submit %></p>
<% end %>

<%= javascript_tag 'CKEDITOR.replaceAll("html");' %>

Код контроллера для создания вложенного объекта фотографии: (page_controller.rb):

def add_photo
  @page = Page.find(params[:id])
  @photo = @page.photos.build
end

Код RJS, который запускается нажатием кнопки «Добавить фотографию» (add_photo.js.rjs):

page.insert_html :bottom, :photos, :partial => 'shared/forms/photo', :object => @photo
page.visual_effect :highlight, :photos, :duration => 2

Часть / форма, которая вводится с помощью RJS (_photo.html.erb):

<%= form_for [@page, photo], :remote => true do |f| %>
<p>
  <%= f.check_box :active %>
  <%= f.text_field :name %>
  <%= f.file_field :photo %>
  <%= f.submit 'Save' %>
</p>
<% end %>

Буду признателен за любую помощь. Я хотел бы решить эту проблему с помощью вложенных форм (не вложенных атрибутов) и RJS, но не смог найти свой путь к документации по этому вопросу.

Спасибо !!

- Якоб

1 Ответ

0 голосов
/ 30 октября 2010

Если вы хотите придерживаться RJS, вам нужно заглянуть во встроенный JavaScript, чтобы увидеть, как они регистрируют все.Вероятно, они просто делают это на DOM ready и привязываются к событию submit ().Скорее всего, он инкапсулирован в методе, который ищет все, что помечено: remote => true, и привязывается к событию submit (), поэтому он будет отправляться через AJAX.Вы можете выполнить ту же логику, но изолировать ее в новой форме.Поэтому, возможно, у вашей части есть тег JavaScript, который выполняет эту логику для этой формы на основе идентификатора или на основе имени класса, игнорируя все, кроме самой последней добавленной формы.

...