Обновление AJAX-фида на пост - PullRequest
0 голосов
/ 07 февраля 2012

Я закончил учебник Hartl по Rails и сейчас пытаюсь узнать немного больше. Я попытался добавить фид-обновление для функции после отправки. Это сработало хорошо, за одним исключением. Почему-то каждый раз, когда я нажимаю кнопку отправки, в базу данных добавляются две записи (дубликаты). В основном, если я смотрю на диалог сервера в терминале, я вижу два из них:

Started POST "/microposts" for 127.0.0.1 at 2012-02-07 22:17:41 +1300
Creating scope :from_users_followed_by. Overwriting existing method Micropost.from_users_followed_by.
  Processing by MicropostsController#create as JS
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"p2pZx4VtIOSnywyVrXnk0vOpI5WdGVeuhLTfEaXmT6o=", "micropost"=>{"content"=>"This is a test post!"}, "commit"=>"Submit"}
  User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 19 LIMIT 1
   (0.1ms)  BEGIN
  SQL (0.4ms)  INSERT INTO "microposts" ("content", "created_at", "updated_at", "user_id") VALUES ($1, $2, $3, $4) RETURNING "id"  [["content", "This is a test post!"], ["created_at", Tue, 07 Feb 2012 09:17:42 UTC +00:00], ["updated_at", Tue, 07 Feb 2012 09:17:42 UTC +00:00], ["user_id", 19]]
   (13.6ms)  COMMIT
   (0.5ms)  SELECT COUNT(*) FROM "microposts" WHERE (user_id IN (SELECT followed_id FROM relationships
 WHERE follower_id = 19) OR user_id = 19)
  Micropost Load (0.5ms)  SELECT "microposts".* FROM "microposts" WHERE (user_id IN (SELECT followed_id FROM relationships
 WHERE follower_id = 19) OR user_id = 19) ORDER BY microposts.created_at DESC LIMIT 5 OFFSET 0
  CACHE (0.0ms)  SELECT COUNT(*) FROM "microposts" WHERE (user_id IN (SELECT followed_id FROM relationships
 WHERE follower_id = 19) OR user_id = 19)
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 19 LIMIT 1
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 19 LIMIT 1
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 19 LIMIT 1
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 19 LIMIT 1
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 19 LIMIT 1
Rendered shared/_feed_item.html.erb (11.7ms)
Rendered shared/_feed.html.erb (20.4ms)
   (0.3ms)  SELECT COUNT(*) FROM "microposts" WHERE "microposts"."user_id" = 19
Rendered microposts/create.js.erb (23.3ms)
Completed 200 OK in 103ms (Views: 26.9ms | ActiveRecord: 23.4ms)

Это мой контроллер микросообщений:

  def create
    @micropost  = current_user.microposts.build(params[:micropost])
    if 
      @micropost.save!
      respond_to do |format|
        format.html { redirect_to root_path }
        format.js
      end
    end
  end

Это мой create.js.erb

$(".ajaxreloadposts").html("<%= escape_javascript(render('shared/feed')) %>")

Это из моего home.html.erb

<% if signed_in? %>
  <table class="front" summary="For signed-in users">
    <tr>
      <td class="main">
        <h1 class="micropost">Create Post:</h1>
        <%= render 'shared/micropost_form' %>
        <span class="ajaxreloadposts">
        <%= render 'shared/feed' %>
        </span>
      </td>
      <td class="sidebar round">
        <%= render 'shared/user_info' %>
        <%= render 'shared/stats' %>
      </td>
    </tr>
  </table>
<% else %>

Наконец, вот мой частичный _feed

<% @feed_items = current_user.feed.paginate(:page => params[:page], :per_page => 5) %>
<% unless @feed_items.empty? %>
  <table class="microposts" summary="User microposts">
    <%= render :partial => 'shared/feed_item', :collection => @feed_items %>
  </table>
  <div class="digg_pagination">
  <%= will_paginate @feed_items %>
  </div>
<% end %>

Интересно, что при обновлении AJAX кнопки разбиения на страницы также неправильно загружаются и принимают форму microposts?= вместо желаемого формата page?=, но это совсем другое дело.

1 Ответ

0 голосов
/ 07 февраля 2012

Кажется, будто ваш ajax-запрос запускается дважды. Проверьте ваше приложение js и убедитесь, что js включены только один раз. Вместо того, чтобы требовать дерева, требуйте js явно.

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