Есть ли способ исправить URL-адрес, который генерирует разбиение на страницы Kaminari?

Я внедрял систему чата в свое приложение, в которой только список комментариев будет перезагружен с помощью ajax submit.

Здесь используется пагинация Kaminari, но после отправки нового комментария в его URL-адресе появляется странная строка, подобная этой.

example-website.com/users/mike/refresh_part?_=1356906069855&page=2

и он получает более странные параметры аргумента в своем URL-адресе, когда комментарий был отправлен в другом контроллере. Только когда он был взломан с ошибкой рассылки спама. Сгенерированный URL:

example-website.com/shop/walmart/topic/20/comments?authenticity_token=9nUyEQ%2Fa0F114vUe16RXf7jhsPw%2B736E%2BKyZFjiWbkQ%3D&comment[body]=test&commit=Create+Comment&page=2&utf8=✓

Как это исправить?

Мои коды

представления/пользователи/show.html.erb

<%= javascript_tag do %>
    jQuery(document).ready(function () {
        refreshPartial();
        setInterval(refreshPartial, 5000)
    });


    function refreshPartial() {
      $.ajax({
        url: "<%= show_user_path(@user) %>/refresh_part",
        type: "GET",
        dataType: "script",
      });
    }
<% end %>
......
<span id="chat">
<%= render 'users/comment' %>
</span>
<%= render 'users/comment_input' %>

представления/пользователи/_comment.html.erb

<table>
  <tr>
    <th>ID</th>
    <th>PIC</th>
    <th>Body</th>
    <th>Subject</th>
    <th>Posted by</th>
    <th>Delete</th>
  </tr>

<% @comments.each do |comment| %>
  <tr id="<%= dom_id(comment) %>">
    <td><%= comment.id %></td>
    <td>
            <% if comment.comment_icon? %>
                <ul class="thumbnails">
                <%= image_tag(comment.comment_icon.url(:thumb),:height => 100, :width => 100, :style => 'border:3px double #545565;' ) %>
                </ul>
            <% end %>

    </td>
    <td><%= comment.body %></td>
    <td><%= comment.subject %></td>
    <td><%= comment.user.user_profile.nickname if comment.user.user_profile %></td>
    <td>
    <%= button_to 'destroy', polymorphic_path([@user, comment]), :data => {:confirm => 'Are you sure?'}, :method => :delete, :disable_with => 'deleting...', :remote => true, :class => 'btn btn-danger' if current_user && current_user.id == comment.user_id %>
    </td>
    </tr>
<% end %>
</table>

<%= paginate @comments, :window => 4, :outer_window => 5, :left => 2, :right => 2 %>

views/users/_comment_input.html.erb ‹= Это форма ввода!!!!!

<%=form_for(([@user, @comment]), :remote => true) do |f| %>
    <div class="field">
      <%= f.label :body %><br />
      <%= f.text_field :body %>
    </div>
    <div class="field">
    <%= f.file_field :comment_icon %>
    </div>
  <div class="actions">
    <%= f.submit %>
  </div>

<% end %>

comments_controller.rb

def create
  commentable = @community_topic||@community||@user
  @comments = commentable.comment_threads.order("updated_at DESC").page(params[:page]).per(5)
  @comment = Comment.build_from(commentable, current_user.try(:id), params[:comment][:body]) 
  @comment.comment_icon = params[:comment][:comment_icon] 


  if @user
    @following_users = @user.all_following(order: 'updated_at DESC') 
    @followed_users = @user.followers 
    @communities_user = @user.get_up_voted(Community).order("updated_at ASC").page(params[:page]).per(5)
  elsif @community      

  end

  last_comment = Comment.where(:user_id => current_user.id).order("updated_at").last

  if last_comment && (Time.now - last_comment.updated_at) <= 10.second  
    flash[:notice] = "You cannot spam!" 
    render :template => template_for(commentable)
  elsif @comment.save 
    #if  @community_topic.empty?
        @comments = commentable.comment_threads.order("updated_at DESC").page(params[:page]).per(5)
        @comment = commentable.comment_threads.build

        respond_to do |format|
            format.html { redirect_to [@community, commentable].uniq, :notice => "comment added!"  }
            format.js do
                if @community.present?
                  render 'communities/refresh_part' 
                elsif @community_topic.present?
                  render 'community_topics/refresh_part'
                elsif @user.present?
                  render 'users/refresh_part'
                end
            end
        end 
  else
    render :template => template_for(commentable)
  end
end

представления/пользователи/refresh_part.js.erb

$('#chat').html("<%= j(render(:partial => 'users/comment')) %>")

person MKK    schedule 02.01.2013    source источник


Ответы (1)


Это известная проблема с Каминари. См.: проблема № 132, Выпуск №182.

Текущий известный обходной путь — вручную установить параметры помощника разбивки на страницы, например:

paginate @comments, :params => { :controller => 'comments', :action => 'index', _: nil, _method: nil, authenticity_token: nil, utf8: nil}

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

Поскольку у вас возникла проблема с отметками времени в URL-адресе, вы должны прокомментировать проблему 132 и опубликовать там подробности своего опыта. Чем больше вы участвуете в проблемах github, тем больше вероятность того, что вы, пользователи проекта и сопровождающие сможете найти лучшее решение.

person Andrew    schedule 02.01.2013
comment
Большое спасибо :) Я попробовал ваше предложение. Но кажется, что это отключает remote=›true :( Можете ли вы сказать, почему? Я добавил это ‹%= paginate at_comments, :window =› 4, :outer_window =› 5, :left =› 2, :right =› 2, :params =› { :controller =› 'сообщества’, :action =› 'показать', _: nil, _method: nil, authentication_token: nil, utf8: nil} %›< /б> - person MKK; 02.01.2013
comment
Что ж, вам просто нужно вернуть :remote => true в список аргументов для paginate. - person Andrew; 02.01.2013