【问题标题】:Rails: Routing error when rendering AJAX partialRails:渲染 AJAX 部分时出现路由错误
【发布时间】:2012-12-22 15:40:45
【问题描述】:

当我尝试在 ajax 调用中渲染部分时遇到路由错误:

Routing Error

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

在我的应用程序中,我的个人资料页面上显示了一个用户的关注者列表。我不想对关注者进行分页,而是尝试通过 AJAX 从服务器返回关注者的下一个偏移量。我的视图已经使用部分显示这些关注者的列表(限制为 5 条记录)。

我的目标是使用 AJAX 调用来返回此部分并格式化记录的下一个偏移量(我还没有实现返回偏移量记录的功能 - 我只是想让 ajax 先工作)。当我在浏览器中访问个人资料页面(并查看前 5 条记录)时,部分工作正常,当我进行 AJAX 调用时发生错误。

这里是 ajax 调用发起的视图中的表单:

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

路线如下:

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

这是响应请求的控制器操作 (relationships#index):

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

load_followers.js.erb 部分:

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

users/following_items.html.erb 部分:

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

最后是关系/follow.html.erb 部分:

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

我已经找到了关系/follow.html.erb 部分的违规代码。当它被删除时,ajax 调用工作正常,部分被附加到ul 的末尾。显然,这与 Rails 的 link_torelationships#destroy 方法存在问题有关 - 但是,我尝试过的任何方法似乎都不起作用。

编辑:这是运行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

谢谢!

【问题讨论】:

  • 如果将resources :relationships, only: [:create, :destroy, :index] 更改为resources :relationships 会发生什么情况,删除是否按预期工作?
  • 您能否发布rake routes 的用户和关系资源结果?
  • @Cyle - 我按照指定更改了路由,重新启动了服务器,但得到了同样的错误。
  • @mmichael - 我刚刚添加了 rake routes 的结果 - 希望有助于缩小范围,谢谢!

标签: ruby-on-rails ruby-on-rails-3 jquery


【解决方案1】:

注意你的 rake 路由输出了这一行:

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

这意味着您的命名路由 user_relationship 需要 userrelationship ID。原因是,relationshipuser 的嵌套资源。

因此,例如,您当前的链接中包含以下内容:

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

应该是这样的:

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

【讨论】:

  • 这是正确的答案。我输入的内容与@Cyle 发布的内容完全相同,哈哈。要指定,您访问销毁操作的路径需要两个参数:user_id 和 relationship_id。所以,正如@Cyle 建议的那样,你需要link_to 'unfollow', user_relationship_path(user.id, relationship) 之类的东西。
  • @mmichael 哎呀,我不是故意要这样偷你的答案。起初我以为是我过去遇到的 DELETE 请求有问题,但后来我意识到他的 link_to 已关闭。
  • 谢谢,效果很好!不太清楚为什么它仍然适用于非 ajax 渲染。对此有什么想法吗?
  • 实际上这是一个非常有效的问题,我不知道答案,所以我尝试自己重现这个问题。我从具有通用 RESTful 路由的两个模型的简单脚手架开始。在同一个服务器实例上,我将其中一个更改为嵌套资源,发现我的旧命名路由仍然有效。只有在重新启动服务器后,它们才会中断并产生NameError。你可能遇到了同样的问题,如果你不是这样,那么我闻到巫术的味道,因为它们真的不起作用!
猜你喜欢
  • 1970-01-01
  • 2019-12-05
  • 2011-03-17
  • 1970-01-01
  • 2015-04-30
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多