Как заставить работать эпизод № 229 Railscasts: Опрос на изменения с вложенным маршрутом?

У меня есть приложение rails 3, очень похожее на приложение в выпуске Railscasts № 229 с той лишь разницей, что в моем коде "Статьи" называются "Сообщения", и у меня есть вложенный маршрут:

routes.rb:

Myapp::Application.routes.draw do
  resources :posts do
    resources :comments
  end
  root :to => "tags#index"
end

Я получаю в терминале такую ​​ошибку:

[2010-09-13 00:22:13] ERROR NoMethodError: undefined method `page_cache_extension' for ActionController::Base:Class
        /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/static.rb:21:in `call'
        /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0/lib/rails/application.rb:168:in `call'
        /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0/lib/rails/application.rb:77:in `method_missing'
        /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0/lib/rails/rack/log_tailer.rb:14:in `call'
        /usr/local/lib/ruby/gems/1.9.1/gems/rack-1.2.1/lib/rack/content_length.rb:13:in `call'
        /usr/local/lib/ruby/gems/1.9.1/gems/rack-1.2.1/lib/rack/handler/webrick.rb:52:in `service'
        /usr/local/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'
        /usr/local/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'
        /usr/local/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'


    Started GET "/posts/comments.js?post_id=1&after=1284333896" for 192.168.1.108 at 2010-09-13 00:22:15 +0000
        Processing by PostsController#show as JS
        Parameters: {"post_id"=>"1", "after"=>"1284333896", "id"=>"comments"}
        SQL (4.8ms)   SELECT name
     FROM sqlite_master
     WHERE type = 'table' AND NOT name = 'sqlite_sequence'

        SQL (1.5ms)   SELECT name
     FROM sqlite_master
     WHERE type = 'table' AND NOT name = 'sqlite_sequence'
        Post Load (0.7ms)  SELECT "posts".* FROM "posts" WHERE ("posts"."id" = 0) LIMIT 1
    Completed   in 392ms

    ActiveRecord::RecordNotFound (Couldn't find Post with ID=comments):
        app/controllers/posts_controller.rb:8:in `show'

    Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (11.4ms)
    Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (49.3ms)
    Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (92.4ms)

posts_controller.rb: 8:

@post = Post.find(params[:id])

Метод индекса Comments_Controller:

def index @comments = Comment.where ("post_id =? and created_at>?", params [: post_id], Time.at (params [: after] .to_i + 1)) конец

application.js:

$(function() {
  if ($("#comments").length > 0) {
    setTimeout(updateComments, 10000);
  }
});

function updateComments () {
  var post_id = $("#post").attr("data-id");
  if ($("#comments").length > 0) {
    var after = $(".comment:last-child").attr("data-time");
  } else {
    var after = "0";
  }
  $.getScript("/comments.js?post_id=" + post_id + "&after=" + after)
  setTimeout(updateComments, 10000);
}

У меня есть подозрение, что проблема во вложенном маршруте. Как заставить Javascript в application.js распознавать вложенный маршрут?

РЕДАКТИРОВАТЬ:

posts / show.html.erb:

<div id="post" data-id="<%= @post.id %>">
  <%= link_to @post.title, @post %>
  <%= simple_format @post.content %>

  <p><%= link_to "Back to Posts", posts_path %></p>

  <% unless @post.comments.empty? %>
    <h2><%= pluralize(@post.comments.size, 'comment') %></h2>

    <div id="comments">
      <%= render @post.comments %>
    </div>
  <% end %>
</div>

<div id="replyform">
  <%= render "comments/form" %>
</div>

комментарии / _form.html.erb:

<%= form_for([@post, Comment.new], :html => { :multipart => true }) do |f| %>
  <fieldset>
    <fieldset id="optional">
      <%= f.label :commenter, "name (optional)" %>
      <%= f.text_field :commenter, :placeholder => "name (optional)" %>

      <%= f.label :email, "email (optional)" %>
      <%= f.email_field :email, :placeholder => "email (optional)" %>
    </fieldset>
  </fieldset>
  <fieldset>
    <%= f.label :body, "reply " %>
    <%= f.text_area :body, :placeholder => "reply" %>
    <%= f.submit 'reply' %>
  </fieldset>
<% end %>

После изменения строки, указанной в application.js, на:

$.getScript("/posts/" + post_id + "/comments/&after=" + after)

Я получаю сообщение об ошибке в моем терминале:

Started GET "/posts/1/comments/&after=1284388076" for 192.168.1.108 at 2010-09-13 14:28:29 +0000
  Processing by CommentsController#show as JS
  Parameters: {"post_id"=>"1", "id"=>"&after=1284388076"}
Completed   in 28ms

ActionView::MissingTemplate (Missing template comments/show with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:js, :"*/*"], :locale=>[:en, :en]} in view paths "/media/usb0/myapp/app/views"):


Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/missing_template.erb within rescues/layout (5.9ms)

ВТОРОЙ РЕДАКТИРОВАНИЕ: комментарии / index.js.erb:

<% unless @comments.empty? %>
  $("#comments").append("<%=raw escape_javascript(render(@comments)) %>");
<% end %>

комментарии / show.js.erb:

$("#comments").append("<%=raw escape_javascript(render(@comments)) %>");

comments_controller.rb:

def show
  @comments = Comment.where("post_id = ? and created_at > ?", params[:post_id], Time.at(params[:after].to_i + 1))
end



Ответы (1)


1. Проверьте вызов getScript.

$.getScript("/comments.js?post_id=" + post_id + "&after=" + after)

Эта строка относится к плоскому маршруту для комментариев. Может быть, это должно быть как

$.getScript("/posts/" + post_id + "/comments?after=" + after)

2. Проверьте свои взгляды.

Ошибка ActiveRecord::RecordNotFound (Couldn't find Post with ID=comments) говорит мне, что неправильная вещь в этой настройке может быть атрибутом data-id на том, который заканчивается в вашем визуализированном представлении. Это должно быть id сообщения. Я могу рассказать больше, если вы поделитесь файлом erb.

person edgerunner    schedule 13.09.2010
comment
Хорошо, теперь я уверен, что это первый ... Исправьте эту строку js, и все должно быть в порядке. - person edgerunner; 13.09.2010
comment
Я по-прежнему получаю сообщение об ошибке $.getScript("/posts/" + post_id + "/comments/&after=" + after). Это размещено выше. Я больше не получаю сообщение об ошибке ActiveRecord::RecordNotFound (Couldn't find Post with ID=comments). Большое спасибо edgerunner, я ценю это. - person 66tree; 13.09.2010
comment
Похоже, вам не хватает файла шаблона в ./app/views/comments/index.js.erb. Предполагается, что он будет содержать замещающие данные. - person edgerunner; 14.09.2010
comment
Сообщения # show теперь обновляют комментарии через ajax, но вместо добавления только новых комментариев он добавляет все существующие комментарии под предыдущими. Код обновлен выше. - person 66tree; 14.09.2010
comment
Ой, моя плохая. Я случайно набрал /& вместо ? при вызове getScript. И это заставило вас перейти к действию comments#show вместо comments#index, как должно было быть. Исправил сейчас. Вы можете откатить свои более поздние изменения и исправить вызов getScript, как указано выше, и он должен работать. - person edgerunner; 14.09.2010
comment
Это сработало! Большое спасибо за терпение ко мне. Удачного вам дня, edgerunner! - person 66tree; 15.09.2010