Is there any possible way to fix the url that Kaminari pagination generates?
Asked Answered
F

1

5

I was implementing a chat system to my app, in which only the list of comments will be reloaded with ajax submit.

Kaminari pagination is used in there, but it gets weird string in its url like this after new comment was submit.

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

and it gets more strange argument parameters in its url when comment was submit in the other controller. Only when it was macthed with spamming error Generated 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=✓

How can I fix this?

My codes are

views/users/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' %>

views/users/_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 <= This is input form!!!!!

<%=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

views/users/refresh_part.js.erb

$('#chat').html("<%= j(render(:partial => 'users/comment')) %>")
Forecast answered 2/1, 2013 at 0:43 Comment(0)
B
14

This is a known issue with Kaminari. See: Issue #132, Issue #182.

The current known workaround is to manually set params on the pagination helper, for example:

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

You'll have to adjust that code to fit your situation, and be sure to test that all other functionality works as expected when you're manually setting all the params.

Since you're specifically experiencing an issue with timestamps on the URL you should comment on Issue 132 and post the details of your experience there. The more you participate in the github issues the more likely that you, the project users, and the maintainers will be able to find a better solution.

Besmirch answered 2/1, 2013 at 2:19 Comment(2)
Thanks a lot:) I tried your suggestion. But it seems that its disabling remote=>true :( can you tell why? I added this <%= paginate at_comments, :window => 4, :outer_window => 5, :left => 2, :right => 2, :params => { :controller => 'communities', :action => 'show', _: nil, _method: nil, authenticity_token: nil, utf8: nil} %>Forecast
Well, you just need to put :remote => true back in your list of arguments for paginate.Besmirch

© 2022 - 2024 — McMap. All rights reserved.