繁体   English   中英

Rails 4:has_many的路由:通过关联

[英]Rails 4: routing for has_many :through association

我有三个型号:

class User < ActiveRecord::Base
  has_many :administrations
  has_many :calendars, through: :administrations
end

class Calendar < ActiveRecord::Base
  has_many :administrations
  has_many :users, through: :administrations
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

当我只使用以下路线时:

resources :users
resources :administrations
resources :calendars

一切正常,意味着我可以访问

  • http://localhost:3000/users
  • http://localhost:3000/administrations
  • http://localhost:3000/calendars

和每个模型的CRUD实例。

但这不是我想要实现的目标。

我想要的是允许用户:

  • 访问所有日历的列表: http://localhost:3000/users/:id/calendars
  • 访问http://localhost:3000/users/:id/calendars/:id每个日历
  • 对于给定的日历,访问此日历的所有用户的列表(但在这里我不确定哪个URL有意义)。

所以我想我需要更新我的路线。

这是我尝试过的:

解决方案1

resources :users do
  resources :administrations
  resources :calendars
end

但是,当我访问http://localhost:3000/users/1/calendars ,我收到以下错误:

NameError in Calendars#index

Showing /Users/TXC/code/rails/calendy/app/views/calendars/index.html.erb where line #27 raised:

undefined local variable or method `new_calendar_path' for #<#<Class:0x007fb807e672d0>:0x007fb807e66510>

Extracted source (around line #27):

<br>

<%= link_to 'New Calendar', new_calendar_path %>

解决方案2

concern :administratable do
  resources :administrations
end

resources :users, concerns: :administratable
resources :calendars, concerns: :administratable

但是,当我访问http://localhost:3000/users/1/calendars ,我收到以下错误:

Routing Error
No route matches [GET] "/users/1/calendars"

我一定错过了一些明显的东西 - 抱歉,我对Rails不太熟悉 - 但我无法弄清楚原因。

知道如何嵌套我的资源吗?

解决方案1是我采取的方式。 问题是,当您嵌套资源时,它会导致帮助程序更改(您可以通过运行rake routes来查看)。 正确的帮助方法是new_user_calendar_path所以改变

<%= link_to 'New Calendar', new_calendar_path %>

<%= link_to 'New Calendar', new_user_calendar_path(@user) %>

其中@user在控制器中设置为指向正确的用户。

奖金

您还可以查看浅层路线 (该页面中的第2.7.2节)。 它们提供了一种使用URL调用嵌套日历的更简洁方法

GET /calendars/:id

代替

GET /users/:userId/calendars/:calendarId

因为calendarId无论如何都是独一无二的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM