Rails嵌套资源url

时间:2015-10-29 20:15:54

标签: ruby-on-rails

我继承了这个应用程序(Rails 4.2.3,Ruby 2.2.2),并且有一些嵌套资源定义为:

resources :meetings do
  resources :users, shallow: true
end

鉴于会议,我可以通过/ meetings / 1#用户访问用户,但不能访问/ meetings / 1 / users。那是为什么?

更新并提供更多信息:

运行rake资源时我确实有这个:

meeting_users GET    /meetings/:meeting_id/users(.:format)  users#index
POST                 /meetings/:meeting_id/users(.:format)  users#create

我从access / meetings / 1 / users获得的错误来自用户控制器:

ActionController::UnknownFormat

在用户控制器中:

def index
   @users = User.where(meeting: @meeting)
   respond_to do |format|
     format.json
   end
end

错误指向respond_to do |format|

2 个答案:

答案 0 :(得分:0)

根据您提供的路线信息,您应该有这样的路线:(bundle exec rake routes):

meeting_users GET    /meetings/:meeting_id/users(.:format)     users#index

因此,您应该能够访问由/meetings/1/users的{​​{1}}操作提供的users_controller,并转到相应的index视图。

答案 1 :(得分:0)

要添加@K M Rakibul Islam的答案,您可以通过在_path后缀前面添加每个资源的路径名称并传入会议对象来访问该链接,如下所示:

<%= link_to "View users for this meeting", meeting_users_path(@meeting) %>

您必须在控制器中定义一个特定的@meeting对象,例如@meeting = Meeting.find(params[:id])或者您正在查找的任何内容。

另外,需要注意的是,在资源丰富的路由上使用shallow: true时,它只会生成[:index, :new, :create]的嵌套路由,而不会生成[:show, :update, :edit, :destroy]的嵌套路由。必须在没有meeting_前缀的情况下访问后者。

# Since using shallow, these would need the meeting prefix
meeting_users    GET    /meetings/:meeting_id/users(.:format)     users#index
new_meeting_user GET    /meetings/:meeting_id/users/new(.:format) users#new
meeting_users    POST   /meetings/:meeting_id/users(.:format)     users#create

# These would not need the meeting prefix
edit_user        GET    /users/:id/edit                           users#edit
user             GET    /users/:id                                users#show
user             PATCH  /users/:id                                users#update
user             PUT    /users/:id                                users#update
user             DELETE /users/:id                                users#destroy