为Controller Action创建一个页面

时间:2013-09-20 19:35:06

标签: ruby-on-rails controller routes ruby-on-rails-4

我之前创建了User/Show Page执行以下步骤:

路线:

# User Profile
  get "users/show"
  get 'user/:id' => 'users#show', as: :user

并在我的 users_controller:

def show
  @user = User.find_by_user_name(params[:id])  # For Name instead of ID
end
  

现在我创建了Albums Scaffold我想做同样的事情:

路线:

# User Albums
  get "users/albums"
  get 'user/:id/albums' => 'users#albums'

并添加到我的 users_controller:

def albums
  @user = User.find_by_user_name(params[:id])  # For Name instead of ID
  @albums = @user.albums
end

在rake路线上,我得到以下

          users_show GET      /users/show(.:format)            users#show
                user GET      /user/:id(.:format)              users#show
        users_albums GET      /users/albums(.:format)          users#albums
                     GET      /user/:id/albums(.:format)       users#albums

首先这是一个很好的做法吗?第二次它不起作用:)

如果我尝试直接访问:

http://localhost:3000/user/username/albums

它有效。

3 个答案:

答案 0 :(得分:2)

我完全赞同你应该为你的路线使用资源的其他海报。然而,您遇到麻烦似乎是用设计描述您的路线。

举个例子,你的路线应该是这样的:

devise_for :users
  devise_scope :user do
    resources :albums
  end

devise docs在“配置路由”下简要地使用devise_scope。

答案 1 :(得分:0)

您可以使用RESTful声明:

resources :users do
    member do
        get 'albums'
    end
end

这将为用户创建所有RESTful路由,并在UsersController(albums_path)中创建相册方法的路径。

如果您正在尝试创建我将使用的关系:

resources :users do
    resources :albums
end

答案 2 :(得分:0)

这不是一个好习惯。资源更好。

由于Album也是一种资源,您可以使用嵌套资源。

resources :user do
  resources :albums
end