yellowaj
yellowaj

Reputation: 465

Rails: Routing error when rendering AJAX partial

I am encountering a routing error when I try to render a partial in an ajax call:

Routing Error

No route matches {:action=>"destroy", :controller=>"relationships", :user_id=>#<User id: 2, username: .....

Within my app, I have a list of followers for a user displayed on the profile page. Instead of paginating the followers, I would like to try to return the next offset of followers from the server through AJAX. My view already utilizes partials for displaying a list of these followers (limited to 5 records).

My goal is to use an AJAX call to return this partial with the next offset of records formated (I haven't implemented the functionality to return offset records yet - I'm just trying to get the ajax working first). The partials work fine when I visit the profile page in my browser (and view the first 5 records), the error occurs when I make the AJAX call.

Here is the form in the view where the ajax call originates:

<%= form_tag user_relationships_path(@user), method: :get, remote: true do %>
    <%= submit_tag 'load more...' %>
<% end %>

Here is the route:

resources :users, only: [:index, :show, :new, :create, :edit, :update, :destroy] do
  resources :relationships, only: [:create, :destroy, :index]
end

Here is my controller action (relationships#index) which responds to the request:

def index
  @user = User.find_by_username(params[:user_id])
    respond_to do |format|
      format.js { render 'load_followers' }
  end
end

The load_followers.js.erb partial:

$('ul#followers').append("<%= render 'users/following_items', users: @user.followers %>")

The users/following_items.html.erb partial:

<% users.each do |user| %>
<li class="clearfix">
    <div class="box-gravatar pull-left">
       <%= link_to user do %>
       <%= gravatar_for user, 40 %>
       <% end %>
    </div>
    <div class="pull-right">
       <%= render 'relationships/follow', user: user %>
    </div>
    <%= link_to user.username, user %>
    <div class="box-author">joined <%= join_date_for user %></div>
</li>
<% end %>

And finally the relationships/follow.html.erb partial:

<% unless current_user?(user) %>
   <% if current_user.following? user %>
      <p><%= link_to 'unfollow', user_relationship_path(user), method: :delete, class: "btn" %></p>
   <% else %>
      <p><%= link_to 'follow', user_relationships_path(user), method: :post, class: "btn btn-primary" %></p>
   <% end %>
<% end %>

I have tracked down the offending code to the relationships/follow.html.erb partial. When that is removed, the ajax call works fine and the partial is appended to the end of the ul. Clearly it has to do with rails having an issue with the link_to to the relationships#destroy method - however, nothing I've tried seems to work.

Edit: Here are the results of running rake routes:

root        /                                                posts#index
            posts_test        /posts/test(.:format)                            posts#test
                submit        /submit(.:format)                                posts#new
                signup        /signup(.:format)                                users#new
                 login        /login(.:format)                                 sessions#new
                logout DELETE /logout(.:format)                                sessions#destroy
                 about        /about(.:format)                                 about#index
                search        /search(.:format)                                search#index
              sessions POST   /sessions(.:format)                              sessions#create
           new_session GET    /sessions/new(.:format)                          sessions#new
               session DELETE /sessions/:id(.:format)                          sessions#destroy
         post_comments POST   /posts/:post_id/comments(.:format)               comments#create
            post_votes POST   /posts/:post_id/votes(.:format)                  votes#create
                 posts GET    /posts(.:format)                                 posts#index
                       POST   /posts(.:format)                                 posts#create
              new_post GET    /posts/new(.:format)                             posts#new
                  post GET    /posts/:id(.:format)                             posts#show
    user_relationships GET    /users/:user_id/relationships(.:format)          relationships#index
                       POST   /users/:user_id/relationships(.:format)          relationships#create
 new_user_relationship GET    /users/:user_id/relationships/new(.:format)      relationships#new
edit_user_relationship GET    /users/:user_id/relationships/:id/edit(.:format) relationships#edit
     user_relationship GET    /users/:user_id/relationships/:id(.:format)      relationships#show
                       PUT    /users/:user_id/relationships/:id(.:format)      relationships#update
                       DELETE /users/:user_id/relationships/:id(.:format)      relationships#destroy
                 users GET    /users(.:format)                                 users#index
                       POST   /users(.:format)                                 users#create
              new_user GET    /users/new(.:format)                             users#new
             edit_user GET    /users/:id/edit(.:format)                        users#edit
                  user GET    /users/:id(.:format)                             users#show
                       PUT    /users/:id(.:format)                             users#update
                       DELETE /users/:id(.:format)                             users#destroy
            categories GET    /categories(.:format)                            categories#index
                       POST   /categories(.:format)                            categories#create
          new_category GET    /categories/new(.:format)                        categories#new
              category GET    /categories/:id(.:format)                        categories#show
                              /:category(.:format)                             posts#index

Thanks!

Upvotes: 3

Views: 1048

Answers (1)

Noz
Noz

Reputation: 6346

Notices your rake routes outputted this line:

DELETE /users/:user_id/relationships/:id(.:format)

This means your named route user_relationship is expecting both user and relationship IDs. Reason being, relationship is a nested resource of user.

So for instance you currently have this in your link to:

= link_to 'unfollow', user_relationship_path(user), method: :delete, class: "btn"

Instead it should be something like:

= link_to 'unfollow', user_relationship_path(user, relationship), method: :delete, class: "btn"

Upvotes: 1

Related Questions