Rails и JQuery - невозможно отключить действие по умолчанию для ссылок - PullRequest
1 голос
/ 29 июня 2010

У меня есть «проверенная» ссылка, которая уходит в действие контроллера с теми же именами. Это перенаправлено как запрос POST. Я настроил код, но происходит то, что jquery $ .post запускается, как хотелось, но html-запрос также происходит, что означает, что мое действие вызывается дважды. Я не могу понять, почему. Кто-нибудь может заметить ошибку, которую я делаю?

В моем приложении. Js

jQuery.ajaxSetup({
  'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
});

$(document).ready(function() {
 $('ul li.sentence_summary a.correct').click(function(){
      $(this).css("border", "1px black solid");
      $.post($(this).attr("href"), null, null, "script");
      return false;
    });

});

в моем контроллере

 def check
    @sentence_author = User.find(params[:user_id])
    @sentence = @sentence_author.sentences.find(params[:id])
    @sentence.checked_at = Time.now
    @sentence.checker_id = current_user.id
    respond_to do |format|
      if @sentence.save!
        flash[:notice] = "Thank you for checking #{@sentence_author.to_s}s sentence."
        format.js {  }
        format.html { redirect_to user_foreign_sentences_path(current_user, :display => :pending) }
        format.xml  { head :ok }
      end
    end
  end

и в файле действий js

alert("testing123");

UPDATE

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

%li{:id => ["sentence", "#{sentence.id}"], :class => "sentence_summary bottom_border_light"}
  %div.left
    = thumbnail_link_to_user_profile(sentence.user, User::GRAVATAR_M)
  %div.left.main_info_container
    %div
      = link_to_user_profile(sentence.user)
      = t('sentences.table.wrote')
    %div.main_focus

      = sentence.text
    %div.bottom_bar
      %div.left
        = created_at_linked_to_sentence_show_path(sentence)
      %div.right.rollover_options
        = render_check_options(sentence)
        = render_edit_options(sentence)
        = render_flag(sentence)
      %div.clear
  %div.clear

и этот помощник отображает соответствующую ссылку

  def render_check_options( sentence)
    if sentence.user != current_user and sentence.language == current_user.native_language and sentence.pending?
      html = link_to("correct", check_user_sentence_path(sentence.user, sentence), :method => "post", :class => "action_options underline_on_hover always_blue correct")
      html += link_to("incorrect", new_sentence_correction_path(sentence), :class => "action_options underline_on_hover always_blue incorrect")
      return html
    end
  end

ОБНОВЛЕНИЕ 2 * согласно совету Тони, вот что происходит в моей консоли Firebug

console.debug($('ul li.sentence_summary a.correct'));

выводит, как и ожидалось, правильные ссылки (я нажимаю на них, и они идут на правильный HTML)

[a.action_options /users/9...24/check, a.action_options  /users/2...26/check, a.action_options /users/2...27/check, a.action_options  /users/9...28/check, a.action_options /users/1.../8/check, a.action_options  /users/2...10/check, a.action_options /users/1...11/check, a.action_options  /users/9...12/check]

но даже после запуска следующих двух команд ссылки не отключаются

   $('ul li.sentence_summary a.correct').unbind('click');


    $('ul li.sentence_summary a.correct').click(function(){
          return false;
        });  

мой html выглядит так для первого li в ul (обратите внимание, что рассматриваемые ссылки скрыты, если не перенесены, следовательно, если для отображения там установлено значение: hidden здесь.)

        <div class="left">
          <a href="/users/9"><img alt="D03e17968fe80cd2d3816e86a7e072f9" class="avatar" src="http://gravatar.com/avatar/d03e17968fe80cd2d3816e86a7e072f9.png?d=identicon&amp;r=PG&amp;s=45"></a>
        </div>
        <div class="left main_info_container">
          <div>
            <a href="/users/9" class="user_name_link underline_on_hover always_blue">maxwell.wiegand</a>
            wrote
          </div>
          <div class="main_focus">
            Aspernatur eum tenetur dolorem impedit dolor modi illum.
          </div>
          <div class="bottom_bar">
            <div class="left">
              <a href="/users/9/sentences/24" class="meta-data underline_on_hover">2 days ago</a>
            </div>
            <div style="display: none;" class="right rollover_options">
              <a href="/users/9/sentences/24/check" class="action_options underline_on_hover always_blue correct" onclick="var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'post'); f.appendChild(m);var s = document.createElement('input'); s.setAttribute('type', 'hidden'); s.setAttribute('name', 'authenticity_token'); s.setAttribute('value', 'ZD3boP6x3HjxzvLBQmTsJT2xCWGQoq8j7M0ZSD6UGbE='); f.appendChild(s);f.submit();return false;">correct</a><a href="/sentences/24/corrections/new" class="action_options underline_on_hover always_blue incorrect">incorrect</a>

              <a href="/sentences/24/flags/new" class="action_options underline_on_hover always_blue">flag</a>
            </div>
            <div class="clear"></div>
          </div>
        </div>
        <div class="clear"></div>

Ответы [ 3 ]

1 голос
/ 29 июня 2010
html = link_to("correct", check_user_sentence_path(sentence.user, sentence), :method => "post", :class => "action_options underline_on_hover always_blue correct")

:method => "post", вероятно, является источником ваших проблем здесь. Это говорит Rails создать форму для отправки, а это означает, что ваш return false; не делает то, что вы думаете.

1 голос
/ 29 июня 2010

Я бы попробовал это:

   $('ul li.sentence_summary a.correct').click(function(e){
      e.preventDefault();
      $(this).css("border", "1px black solid");
      $.post($(this).attr("href"), null, null, "script");
    });
1 голос
/ 29 июня 2010

Попробуйте удалить

$(this).css("border", "1px black solid");
      $.post($(this).attr("href"), null, null, "script");

просто верните false и скажите мне, что происходит

обновление

Если вы установили для ссылки нажатие, чтобы она возвращала false, она не должна идти никуда. Я бы проверил две вещи -

1) Убедитесь, что селектор правильный: какой вывод, когда вы делаете это?

console.debug($('ul li.sentence_summary a.correct'));

2) Убедитесь, что никакие другие обработчики щелчков не мешают: После проверки # 1 откройте консоль JS и выполните:

$('ul li.sentence_summary a.correct').unbind('click');

Это приведет к отмене привязки всех событий щелчка, включая то, которое вы хотите совершить. Затем повторно свяжите событие click, выполнив ваш обычный код в консоли (верните только false в обработчике click). Это гарантирует, что только один обработчик прослушивает событие нажатия ваших ссылок и что один обработчик вернет false и не выполнит ссылку.

3) Опубликуйте сгенерированный HTML, чтобы мы могли посмотреть

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