【问题标题】:Avoid custom route duplication for Single Table Inheritance避免单表继承的自定义路由重复
【发布时间】: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。

【问题讨论】:

标签: ruby-on-rails-4 routes single-table-inheritance


【解决方案1】:

这是我最终使用路由问题的路线:

  concern :addressable do
    member do
      get :edit_address
      patch :update_address
    end
  end

  resources :shmoovee,  path: :users, controller: :users, type: "shmoovee", concerns: :addressable 

  resources :shmoover,  path: :users, controller: :users, type: "shmoover", concerns: :addressable 

  resources :users do
    concerns :addressable
    # other user routes
  end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2016-12-13
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多