Использование модального режима для отображения пути редактирования - PullRequest
1 голос
/ 02 апреля 2012

Я пишу приложение ruby ​​on rails 3, которое очень простое: пользователи могут создавать посты, которые отображаются на их домашней странице, а также редактировать эти посты и удалять их. Мой вопрос относится к функции редактирования. Я знаю, что типичный способ отредактировать что-либо - это позвонить

<%= link_to "edit", edit_post_path(post_item) %>

где post_item - выбранный пост. Однако вместо перенаправления пользователя на страницу редактирования (/views/posts/edit.html.erb) я хотел бы сделать так, чтобы при нажатии пользователем кнопки редактирования страница редактирования отображалась в модальном режиме. Я использую twitter-bootstrap и знаю, как создавать модалы. Есть идеи?

Ответы [ 3 ]

1 голос
/ 29 апреля 2012

Не уверен, что если вы все еще работаете над этим, у меня была похожая проблема, и я решил ее, выполнив следующее:

Я использую диалог jquery-ui, а не модал начальной загрузки, поскольку не смогсделай так, чтоб это работало.поэтому добавьте туда библиотеку, если у вас ее нет.

в assets / javascripts / application.js у меня есть

$(document).ready(function() {

        var modal=$('#modal');
        $('#edit_house_link').click(function(e) {
          var edit_url = $(this).attr('href'); 
          modal.load(edit_url + ' #content',function(){
            modal.dialog("open");
          });
        });
        modal.dialog({ autoOpen: false, title: "Your title", draggable: true,
        resizable: false, modal: true, width:'auto'});

    });

, тогда в моих раскладках / application.html.erb у меня есть

<p id="modal"></p>

где-то внутри тела страницы, которое является элементом, в который мы собираемся загрузить всю информацию.

в моем представлении индекса у меня есть ссылка, которая обрабатывает это, обратите внимание, чтомоя модель называется house, так что измените на любую вашу.

<%= link_to 'Edit', edit_house_path(house), :remote => true, :id => 'edit_house_link' %>

Как вы видите, я даю этот идентификатор edit_house_link, на который я ссылаюсь в файле application.js.

внутри контроллера дома у меня есть:

def update
  @house = House.find(params[:id])
  respond_to do |format|
    if @house.update_attributes(params[:house])
      format.js 
    else
      format.js
    end
  end
end

, а затем у меня есть три вида, один из которых - edit.html.erb, update.js.erb и _form.html.erb дляПапка views / Houses.

, поэтому внутри views / Houses / update.js.erb у меня есть:

<%- if @house.errors.any? %>
  $('#modal').html('<%= escape_javascript(render('form')) %>');
<%- else %>
  $('#modal').dialog('close');
  $('#modal').remove();
  window.location.reload();
<%- end %>

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

в файле views / Houses / edit.html.erb это то, что у меня есть:

<div id="content">
<%= render :partial => 'form' %>
</div>

, поэтому, если вы снова посмотрите на идентификатор контента в файле application.js, мы загружаем его в модальный файл.

и, наконец, в частичные views / Houses / _form.html..erb

<%= simple_form_for(@house, :html => { :class => 'form-vertical' }, :remote => true) do |f| %>
<fieldset>
    <%= f.input :address %>
    <%= f.input :postcode %>
    <%= f.input :city %>
    <%= f.input :country %>
</fieldset>
    <div class="form-actions">
    <%= f.button :submit %>
    </div>
<% end %>

Я использую simple_form, поэтому вы можете приспособиться к вашим потребностям, имея нормальную форму, но мне пришлось добавить атрибут: remote => true, чтобы он действительно работал.

надеюсь, это поможет!

0 голосов
/ 11 июля 2019

пытался следовать за проголосовавшим ответом, но у меня это не сработало. Поэтому я запланировал рабочее решение. Вот что я сделал.

1.) Сначала я добавил //= require jquery-ui в мои активы javascript

2.) Я создал форму для редактирования своих заметок. Идентификационные имена используются здесь. Также, если вы заметили, что мой URL в теге формы является пустой строкой. вы увидите на моем javascript.


<%# this is the form that is used to update the notes %>
<div id="dialog" title="Update Notes">
  <%= form_tag('', method: "put", class: 'comment_form', id: 'workorder_form') do %>
    <div>
      <%= text_area_tag(:message, '', class: "form-control workorder_notes_text_area") %>
    </div>
    <div class="mt-5 text-right">
      <%= submit_tag("Submit", type:"submit", class:"btn btn-primary", id: 'workorder_notes_button')  %>
    </div>
  <% end %>
</div>

3) для каждого списка заметок я получаю идентификатор заметки и прикрепляю его к сообщению заметки

<%# id attribute is also used to get the %>
   <td class="text-center" id="note_message_id_<%=note.id%>">
        <%= note.message %>
   </td>

4) для кнопки редактирования я использовал атрибут данных, чтобы добавить некоторые данные, такие как идентификатор заметки. также, edit-workorder имени класса используется для прослушивания события нажатия для каждой кнопки

<button data-notesid="<%= note.id%>" class="btn btn-success edit-workorder">
   <span class="icon icon-pencil"></span> 
</button>

ЧАСТЬ JAVASCRIPT

5) прослушивание события нажатия для каждой кнопки редактирования

$('.edit-workorder').click(function(e) {}

the next javascript are inside the click event function

6) Это захватывает данные внутри атрибута данных кнопки. см. номер 4.

const notesId = $(this).data('notesid');

7) это захватит текущее сообщение и обрежет его.

// this will return the current notes and removes spaces
    const notesMsg = $(`td#note_message_id_${notesId}`)
      .text()
      .trim();

8) захватывает диалог.

// dialog modal
    // this comes from _workordernotes.html.erb
    const dialogUI = $('#dialog');

9) это будет прикреплено к form_tag, поэтому URL будет динамическим. Мне это нужно из-за идентификаторов заметок.

 $('#workorder_form').attr('action',`${workorderId}/workordernotes/${notesId}`);

10) это диалоговая часть. Метод close важен, потому что когда вы впервые открываете модальное и закрываете его. URL действия не изменится, потому что состояние сохраняется. Вам необходимо уничтожить элемент или перевести его в исходное состояние (состояние пустой строки).

  // dialog API
    // https://api.jqueryui.com/dialog/
    dialogUI.dialog({
      modal: true,
      draggable: false,
      height: 400,
      width: 600,
      resizable: false,
      // show: { effect: 'slideDown', duration: 1000 },
      // on close dailog should return from its normal state or else
      // action attribute wont change
      close: function(e, ui) {
        dialogUI.dialog('destroy');
      }
    });

11) наконец, это прикрепит текущее сообщение к текстовой области формы.

$('textarea#message').val(notesMsg);

workordernotes_controller.rb RoR

12) вот мой метод обновления. это еще не сделано. Мне просто нужно создать блок try-catch, тогда все готово. но над всем его работающим.

def update
   Spree::Workordernote.find(params[:id]).update(message: params[:message])
   redirect_to admin_workorder_path(params[:workorder_id])
end

ПОЛНЫЙ КОД JAVASCRIPT

$(document).ready(function() {
  $('#dialog').hide();

  const workorderId = $('tbody#table_body').data('workorderid');

  $('.edit-workorder').click(function(e) {
    e.preventDefault();

    // returns the workordernotes ID
    // this comes from _workordernotes.html.erb button
    const notesId = $(this).data('notesid');

    // this will return the current notes and removes spaces
    const notesMsg = $(`td#note_message_id_${notesId}`)
      .text()
      .trim();

    // dialog modal
    // this comes from _workordernotes.html.erb
    const dialogUI = $('#dialog');

    // this should be called before dialog or else action attr wont attached
    $('#workorder_form').attr(
      'action',
      `${workorderId}/workordernotes/${notesId}`
    );

    // dialog API
    // https://api.jqueryui.com/dialog/
    dialogUI.dialog({
      modal: true,
      draggable: false,
      height: 400,
      width: 600,
      resizable: false,
      // show: { effect: 'slideDown', duration: 1000 },
      // on close dailog should return from its normal state or else
      // action attribute wont change
      close: function(e, ui) {
        dialogUI.dialog('destroy');
      }
    });

    // attached the old message on text area
    $('textarea#message').val(notesMsg);
  });
});

0 голосов
/ 02 апреля 2012

Самый простой способ - установить параметр remote => true для вашей ссылки.А на стороне клиента визуализируйте js, который будет частично отображаться в вашей форме, и вызовите $ ('# myModal'). Modal (options) и откройте диалоговое окно.

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