![](/img/trans.png)
[英]Rails 3 routing error in a relationship in a has_many => through association
[英]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
每个日历 所以我想我需要更新我的路线。
这是我尝试过的:
解决方案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.