ruby-on-rails - Rails3 嵌套路由问题

标签 ruby-on-rails routes rest ruby-on-rails-3

我想为用户创建一种机制来跟踪其他最喜欢的用户,类似于SO最喜欢的问题。我正在使用 Rails 3.0 beta。

为此,我有一个用户最喜欢的 HABTM 关系,它按预期工作:

class User < ActiveRecord::Base
  has_and_belongs_to_many :favorites, :class_name => "User", :join_table => "favorites", :association_foreign_key => "favorite_id", :foreign_key => "user_id"
end

收藏夹 Controller 只需要 7 个 RESTful 方法中的 3 个来管理用户的收藏夹:

class FavoritesController < ApplicationController

  # GET /favorites
  # GET /favorites.xml
  def index

    @user = User.find(params[:user_id])
    @favorites =  @user.favorites.joins(:profile).order("last_name,first_name")

    ...

  end

  def create

    @favorite = User.find(params[:id])
    current_user.favorites << @favorite

    ...

  end

  def destroy

    @favorite = User.find(params[:id])
    current_user.favorites.delete(@favorite)

    ...

  end

end

Routes.rb 文件包含路由指令:

resources :users, :except => :destroy do
  resources :favorites, :only => [:index,:create,:destroy]
end

生成这些用户最喜欢的路线:

GET    /users/:user_id/favorites(.:format)            {:controller=>"favorites", :action=>"index"}
user_favorites POST   /users/:user_id/favorites(.:format)            {:controller=>"favorites", :action=>"create"}
user_favorite DELETE /users/:user_id/favorites/:id(.:format)        {:controller=>"favorites", :action=>"destroy"}

在用户的显示 View 中,可以使用图像链接将用户 (@user) 切换为收藏夹,这按预期工作:

<% if [test if user is a favorite] %>

    # http://localhost:3000/favorites/destroy/:id?post=true
    <%= link_to image_tag("favorite.png", :border => 0), :controller => :favorites, :action => :destroy, :post=>true, :id => @user %>

<% else %>

    # http://localhost:3000/favorites/create/:id?post=true
    <%= link_to image_tag("not-favorite.png", :border => 0), :controller => :favorites, :action => :create, :post=>true, :id => @user %>

<% end %>

但是,在当前用户最喜欢的索引 View 中,每个最喜欢的用户的链接:

# http://localhost:3010/users/4/favorites/3?post=true
<%= link_to image_tag("favorite.png", :border => 0), :controller => :favorites, :action => :destroy, :id => favorite, :post=>true %>

生成一个错误,内容如下:

没有路线匹配“/users/4/favorites/3”

问题:

  1. 我是否正确指定了我的路由?看起来创建和销毁路由只需要收藏夹的 ID,因为收藏夹的“所有者”始终是 current_user。
  2. 如果我只是在“显示” View 中引用 Controller /操作,我是否还需要创建/销毁路由?
  3. 为什么索引 View 中的 link_to 无法正常工作?
  4. 整体方法是否有任何可以改进的地方?

最佳答案

您的路由看起来不错。

不过,我认为您的 link_to 有问题。一方面,RESTful 方式不是使用 :controller 和 :action 参数指定 URL。正确的方法是使用生成的 URL 方法,例如 user_favorite_path。此外,在针对销毁操作时,您需要指定 :method 参数。我认为 link_to 应该是这样的:

<%= link_to image_tag("favorite.png", :border => 0), user_favorite_path(@user, @favorite), :method => :delete %>

我相信它说没有路由与该 URL 匹配的原因是因为您没有将 :method 指定为 :delete。

关于ruby-on-rails - Rails3 嵌套路由问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3290792/

相关文章:

mysql - Rake DB 迁移 MySQL

javascript - 无法在 Express 应用程序中连接路线

web-services - 将旧式RPC样式服务切换到REST有什么好处?

WCF REST 参数不能包含句点?

ruby-on-rails - Rails 中的日期验证

ruby-on-rails - RABL 将 ActiveRecord 时间戳或日期时间呈现为数字而不是字符串

java - 在使用 CamelContext.start() 进行路由之前,如何测试 org.apache.camel.CamelContext 中的端点是否无效凭据或无效 URL?

php - REST 额外字段并加入 Yii2

ruby-on-rails - rails api 中被阻止的用户配置文件的最佳 HTTP 状态代码是什么?

node.js - 如何在 Express 中的路由之间传递数据