【发布时间】:2017-03-26 17:34:56
【问题描述】:
我有几种使用简单表继承创建的用户类型(Mover 和 Movee)。我正在遵循类似的方法在我的路线中传递类型 STI, one controller。但我发现自己在基类和两个子类中重新定义了相同的自定义路由。
以下是模型的外观:
User
name
email
address
Movee < User
has_many: moves
Mover < User
Movee 下的移动将有其地址集。 Mover 将有一个地址,并在 User 模型中定义。首次创建用户时,他们只需要姓名和电子邮件,默认用户类型为 Movee。
然后你可以去一个页面更新你的地址,这会让你从一个Movee变成一个Mover。
Mover 可以重新更新地址。我在用户模型中定义了一个自定义的 edit_address 操作,因为您可以将地址更新为 Movee(将自己变成 Mover)或 Mover(如果您需要重新更新地址)。
用户.rb
def edit
end
def edit_address
end
def update_address
@user.update(user_address_params)
@user.type = "Mover"
@user.save
end
def update
@user.update(user_params)
end
def user_params
params.require(params[:type].to_sym).permit(
:first_name, :last_name,
:type)
end
def user_address_params
params.require(params[:type].to_sym).permit(:address)
end
edit_address 操作的参数哈希看起来像
{
movee: { address: "some address"}
type: "movee"
}
在导航栏中,我指向一个通用的编辑用户路径:
<li><a href="<%= edit_address_user_path(current_user) %>"> Update Address</a></li>
现在路线重复:
routes.rb
resources :shmoovee, path: :users, controller: :users, type: "shmoovee" do
member do
get :edit_address
patch :update_address
end
end
resources :shmoover, path: :users, controller: :users, type: "shmoover" do
member do
get :edit_address
patch :update_address
end
end
resources :users do
member do
get :edit_address
patch :update_address
end
end
问题:有没有办法绕过路线重复?我需要子类路由才能传入类型来解析强参数,但我还需要基类路由才能在视图中使用通用路由助手 edit_address_user_path。
【问题讨论】:
-
检查路由问题,它可能会派上用场,或者它可能会做你真正想要实现的目标edgeguides.rubyonrails.org/routing.html#routing-concerns
-
@kurenn,感谢您指出路由问题,我可以用它重构常用路由并减少重复。
标签: ruby-on-rails-4 routes single-table-inheritance