0

在我的应用程序中,我有一个 User 模型,它定义了一个返回 Activity 对象列表的历史方法,显示用户执行的最后 N 个操作。UserController#history 方法将其与视图关联。

代码如下所示:

class UserController < ApplicationController
  def history
    user = User.find(params[:id])
    @history = user.history(20)
  end
end

class User < ActiveRecord::Base
  has_many :activities    

  def history(limit)      
      ...
  end
end

当然,我还将这一行添加到我的 routes.rb 文件中:

match '/user/:id/:action', :controller => 'user'

所以现在当我转到 localhost:3000/user/8/history 时,我看到了用户 8 的历史记录。一切正常。

作为一个 Rails NOOB,我想知道是否有一些针对这种情况的罐装解决方案可以简化代码。我的意思是,如果 /user/8 是访问用户 8 页面的 RESTful 方式,是否可以告诉 Rails /user/8/history 应该显示通过调用用户 8 的 history() 返回的数据?

4

2 回答 2

2

首先,命名控制器的约定是复数形式,除非它仅用于单个资源,例如会话。

关于路线,我相信您在路线中使用了resources“助手”,您可以做的是指定到用户的资源路线也有一个成员操作来获取这样的历史记录

resources :users do
  member do
    get :history
  end
end

我认为没有更清洁的方法可以做到这一点

你可以在这里查看http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

于 2013-02-06T21:10:28.150 回答
0

就 Rails 标准而言,这是在您的案例中显示历史的正确方法。在 Rails 中,控制器被认为是视图和模型的中间件,所以定义一个动作history对我来说似乎很好。

您可以以更好的方式指定路线:

resources :user do
  get 'history', :on => :member #it will generate users/:id/history as url.
end
于 2013-02-06T21:08:11.060 回答