Обновлен до Rails 3.1, изменен на jQuery, теперь мой ajax, похоже, не обновляет поле - PullRequest
0 голосов
/ 24 декабря 2011

У меня есть веб-сайт (GiggleTrigger.com), где пользователи могут голосовать за изюминки, которые они считают забавными (нажав кнопку «хихикать»).Это было настроено на вызов ajax, но теперь, после обновления до Rails 3.1, я, кажется, сломал это.Я пытался обновить javascript до jQuery, но он все еще не работает.

Вот старый код javascript (помещен в views / голоса / create.js.rjs):

page.replace_html "vote_total_#{@punchline.id}", "#{@punchline.votes.size}"

Вот попытка обновленного кода (помещена в views / голоса / create.js.erb):

$("#vote_total_#{@punchline.id}").html("<%= escape_javascript render @punchline.votes.size  %>");

Вот HTML (помещено в views / punchlines / _punchline.html.erb):

<span id="vote_total_<%= punchline.id %>" class="punchline_votes">
    <%= punchline.votes.size %>
</span>
<span id="vote_button">
    <%= button_to 'giggle', punchline_votes_path(:punchline_id => punchline), :remote => true %>
</span>

Вот код контроллера (помещен в controllers / VoteController.rb):

class VotesController < ApplicationController
  def create
    @punchline  = Punchline.find(params[:punchline_id])
    @vote       = @punchline.votes.build params[:vote]
    @vote.user  = current_user

    respond_to do |format|
      if @vote.save
        format.js        
        format.html { redirect_to @punchline }
      else
        format.html { redirect_to root }
      end
    end
  end
end

* Я получаю эту ошибку:

ActionView::Template::Error (undefined method `model_name' for Fixnum:Class):
  1: $("#vote_total_#{@punchline.id}").html("<%= escape_javascript render @punchline.votes.size  %>");
      app/views/votes/create.js.erb:1:in `_app_views_votes_create_js_erb__1782616409977082835_2168430380'
      app/controllers/votes_controller.rb:7:in `create

Поскольку это похоже на проблему с передачей целого числа, я добавляюметод .to_s, например:

$("#vote_total_#{@punchline.id}").html("<%= escape_javascript render @punchline.votes.size.to_s  %>");

Но я получаю эту ошибку:

ActionView::Template::Error (Missing partial votes/1, application/1 with {:handlers=>[:erb, :builder, :coffee], :formats=>[:js, :html], :locale=>[:en, :en]}. Searched in:
  * "/Users/Daniel/Sites/giggle/app/views"
  * "/Users/Daniel/.rvm/gems/ruby-1.9.2-p290@giggle/gems/devise-1.5.3/app/views"
):
    1: $("#vote_total_#{@punchline.id}").html("<%= escape_javascript render @punchline.votes.size.to_s  %>");
  app/views/votes/create.js.erb:1:in `_app_views_votes_create_js_erb__1782616409977082835_2187483480'
  app/controllers/votes_controller.rb:7:in `create'

Я пытаюсь добавить частичноевот так:

$("#vote_total_#{@punchline.id}").html("<%= escape_javascript render :partial => 'punchline', :object => @punchline.votes.size  %>");

Но тогда я получаю эту ошибку:

ActionView::Template::Error (Missing partial votes/punchline, application/punchline with {:handlers=>[:erb, :builder, :coffee], :formats=>[:js, :html], :locale=>[:en, :en]}. Searched in:
  * "/Users/Daniel/Sites/giggle/app/views"
  * "/Users/Daniel/.rvm/gems/ruby-1.9.2-p290@giggle/gems/devise-1.5.3/app/views"
):
    1: $("#vote_total_#{@punchline.id}").html("<%= escape_javascript render :partial => 'punchline', :object => @punchline.votes.size.to_s  %>");
  app/views/votes/create.js.erb:1:in `_app_views_votes_create_js_erb__1782616409977082835_2185760740'
  app/controllers/votes_controller.rb:7:in `create'

Когда я нажимаю кнопку хихиканья, голос добавляется кобъект модели, но он не обновляет представление, пока я не обновлю страницу.Очевидно, я хочу, чтобы это происходило через ajax без обновления.Спасибо!

Ответы [ 2 ]

1 голос
/ 24 декабря 2011

Вы можете добавить

if(!document.getElementById("vote_total_#{@punchline.id}")) {
  alert("Id doesn't exist: " + "vote_total_#{@punchline.id}");
}

На ваш javascript, и это предупредит вас, если идентификатор неверен. Плохо означает, что элемент с таким идентификатором не существует. Мне любопытно, что на самом деле генерируется для клиента, это ajax, все по большей части на стороне клиента.

Вам также следует проверить консоль (firebug или инспектор webkit) и включить ведение журнала XMLHttpRequest и посмотреть, выполняется ли какой-нибудь настоящий ajax при нажатии Giggle: D

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

-Если кто-то мог бы прокомментировать Firebug, это было бы замечательно.

0 голосов
/ 25 декабря 2011

Хорошо, я понял это. Старый код прототипа:

page.replace_html "vote_total_#{@punchline.id}", "#{@punchline.votes.size}"

использует # {} для публикации данных ruby ​​в элемент. Но jQuery использует # для представления идентификатора. Итак, я изменил свой селектор jquery с # {} на <% =%>, и это решило проблему:

$("#vote_total_<%= @punchline.id %>").html("<%=@punchline.votes.size%>");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...