Использование идентификатора кнопки для частичного рендеринга в Rails

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

Для простоты мне удалось сделать так, чтобы идентификатор кнопки совпадал с идентификатором события. Итак, я хочу, чтобы при нажатии кнопки с идентификатором 2 внизу отображалась форма для редактирования события с идентификатором 2.

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

Все, что у меня есть до сих пор (все кнопки редактирования имеют класс btn-info):

$(document).ready(function(){
    $('.btn-info').click(function(e){
        e.preventDefault;
        var btnID = this.id;
        //something here to get the partial to render 
    });
}); 

Могу ли я использовать что-то вроде следующего для вызова частичного? Я знаю, что это не работает, но может дать лучшее представление о том, чего я пытаюсь достичь:

$("#events").html("<%= escape_javascript render( edit_event_path(btnID) ) %>");

ОБНОВЛЕНИЕ: По запросу контроллеры и представления:

Изменить действие на контроллере событий:

def edit
    @event = Event.find(params[:id])

    respond_to do |format|
      format.html
      format.js
    end
end

Проекты показывают представление с вставленным javascript:

<script>
    $(document).ready(function(){
    $('#new-event-button').click(function(e){
        e.preventDefault();
        $('#edit-events').hide();
        $('#delete-events').hide();
        $('#new-event').slideDown(function(){
            $('html, body').animate({
            scrollTop: $(document).height()-$(window).height()},200,"linear"
            );
        });
    });
    $('#edit-events-button').click(function(e){
        e.preventDefault();
        $('#new-event').hide();
        $('#delete-events').hide();
        $('#edit-events').slideDown(function(){
            $('html, body').animate({
            scrollTop: $(document).height()-$(window).height()},200,"linear"
            );
        });
    });
    $('#delete-events-button').click(function(e){
        e.preventDefault();
        $('#new-event').hide();
        $('#edit-events').hide();
        $('#delete-events').slideDown(function(){
            $('html, body').animate({
            scrollTop: $(document).height()-$(window).height()},200,"linear"
            );
        });
    });
    $('.btn-info').click(function(e){
        e.preventDefault;
        $('#events-forms').after('<%= escape_javascript( render :partial => "eventform", :locals => { :event => @event } ) %>');
    });
});

</script>

<div class="content-box timeline-box">
<div id="my-timeline"></div><br /><br />
<br />

<button id="new-event-button" class="btn btn-success btn-large">New Event</button>
<button id="edit-events-button" class="btn btn-info btn-large">Edit Events</button>
<button id="delete-events-button" class="btn btn-danger btn-large">Delete Events</button>

<div id="events-forms">
    <div id="new-event">
        <%= render :partial => "new_event", :locals => { :event => Event.new(:timeline_id=>@timeline.id) } %>
    </div>

    <div id="edit-events">
        <%= render :partial => "edit_events", :locals => { :events => current_user.events } %>  
    </div>

    <div id="delete-events">
        <%= render :partial => "delete_events", :locals => { :events => current_user.events } %>        
    </div>
</div>

И форма для редактирования события ('_eventform.html.erb'):

<%= form_for(event) do |f| %>
  <% if event.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(event.errors.count, "error") %> prohibited this event from being saved:</h2>

      <ul>
      <% event.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <%=f.hidden_field 'timeline_id', :value => current_user.timeline.id %>
  <div class="field">
    <%= f.label :start_date %><br />
    <%= f.date_select :start_date %>
  </div>
  <div class="field">
    <%= f.label :headline %><br />
    <%= f.text_area :headline %>
  </div>
  <div class="field">
    <%= f.label :text %><br />
    <%= f.text_area :text %>
  </div>
  <div class="field">
    <%= f.label :media %><br />
    <%= f.text_area :media %>
  </div>
  <div class="field">
    <%= f.label :caption %><br />
    <%= f.text_area :caption %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

person ecs    schedule 15.10.2012    source источник


Ответы (1)


Вот что я бы сделал в частичном списке:

<% @events.each do |event| %>
   <div id="event_<%= event.id">
      #... whatever event display code you use
      <%= link_to "edit", edit_event_path(event), :class => '.btn-info', :remote => true %>
   </div>
<% end %>

В вашем контроллере:

class EventsController < ApplicationController

  def edit
    @event = Event.find(params[:id])
    #.. whatever else you currently have here

    respond_to do |format|
      format.html
      format.js
    end
  end

end

Затем в новом представлении (app/views/events/edit.js.erb):

$('#event_<%= @event.id %>').after('<%= escape_javascript( render :partial => "edit_events", :locals => { :event => @event } ) %>');
person Zach Kemp    schedule 15.10.2012
comment
Я, вероятно, должен был сказать - я использую представление проекта для отображения событий, поэтому вы можете создать новое событие или отредактировать существующее на той же странице - здесь отображаются частичные фрагменты. На данный момент я вставил javascript в верхнюю часть представления проекта#show (только пока!). Поэтому, когда я использую то, что вы предложили, я получаю эту ошибку: «неопределенная локальная переменная или метод «событие» для #‹#‹Class:0x40ee0b8›:0x4295c70›». Имеется в виду строка «form_for(event) do». - person ecs; 16.10.2012
comment
Как мне сделать эквивалент этого для вызова частичного?: ‹%= render :partial =› edit_events, :locals =› { :event =› @event } %› - person ecs; 16.10.2012
comment
Я внес изменения в edit.js.erb выше. Дайте мне знать, если это работает с вашей формой. - person Zach Kemp; 16.10.2012
comment
К сожалению, нет, теперь я получаю эту ошибку: неопределенный метод `model_name' для NilClass:Class. Это относится к этой строке: ‹%= form_for(event) do |f| %›, который находится в частичной форме. Любые идеи!? - person ecs; 16.10.2012
comment
Можете ли вы опубликовать свое действие контроллера edit и частичную форму вашего события? Можете ли вы выполнить действие редактирования самостоятельно (т.е. без javascript)? - person Zach Kemp; 16.10.2012
comment
Готово - все добавил. Я могу щелкнуть ссылку редактирования рядом с перечисленным событием, которая приведет меня на страницу редактирования этого события, да, но, конечно же, мне нужен javascript для передачи идентификатора события, чтобы отобразить правильную форму редактирования ниже? Спасибо за вашу помощь до сих пор :) - person ecs; 16.10.2012
comment
Я пробовал это без javascript, и, поскольку я получаю точно такое же сообщение об ошибке, я предполагаю, что это означает, что идентификатор события не передается в вызов рендеринга? Я не знаю, что делать, чтобы исправить это!! - person ecs; 16.10.2012
comment
Да, это то, что делает link_to "edit", edit_event_path(event) ... :remote => true — он вызывает действие edit для текущего события и отображает шаблон edit.js.erb. Что в партиале edit_events? Кажется, вы где-то проезжаете nil. - person Zach Kemp; 16.10.2012
comment
давайте продолжим обсуждение в чате - person Zach Kemp; 16.10.2012
comment
Как я уже сказал, судя по логам, это наконец-то работает, но я не могу проверить это, так как Webrick решил отдохнуть...! - person ecs; 16.10.2012
comment
Вы можете попробовать добавить gem 'thin' в свой gemfile, а затем запустить сервер с rails s thin. webrick не требуется. - person Zach Kemp; 16.10.2012
comment
Казалось, что на этот раз перезагрузки было достаточно. И теперь код отлично работает, спасибо за вашу помощь! - person ecs; 16.10.2012