【问题标题】:Nested routing for models with double associations具有双重关联的模型的嵌套路由
【发布时间】:2009-12-30 02:12:13
【问题描述】:

在一个玩具 Rails 应用程序中,我正在模拟一种情况,您有许多罐子,每个罐子都包含一定数量的东西,您可以在罐子之间进行交易。一笔交易可以来自任何底池,也可以去任何底池。

以下是模型的相关部分:

class Pot < ActiveRecord::Base
  has_many :to_transactions, :foreign_key => "to_id", :class_name => "Transaction"
  has_many :from_transactions, :foreign_key => "from_id", :class_name => "Transaction"
end

class Transaction < ActiveRecord::Base
  belongs_to :to_pot, :class_name => "Pot", :foreign_key => "to_id"
  belongs_to :from_pot, :class_name => "Pot", :foreign_key => "from_id"
end

这允许我在控制台执行以下操作:

>> p = Pot.find(123)
>> p.from_transactions
=> # returns array of transactions from pot 123
>> t = p.to_transactions.new
=> # t is a new transaction with to_id set to 123

等等。

我在设置路由时遇到问题。例如,我想:

  • /pots/123/from_transactions 提供来自 123 号池的所有交易的列表,
  • /pots/123/to_transactions/new 提供新的交易表格,to_id 设置为 123

这可能吗?感激地收到任何帮助等等等等。

【问题讨论】:

    标签: ruby-on-rails routing


    【解决方案1】:

    我想说一种干净的管理方式是所有与 from_transactions 相关的请求都转到 from_transactions_controller,而与 to_transactions 相关的所有请求都转到 to_transactions_controller。但两者的基础模型可能相同:

    在路由文件中,您可以按如下方式指定路由:

    'pots/:id/to_transactions/new', :controller => 'to_transactions', :action => 'new' 
    'pots/:id/from_transactions/', :controller => 'from_transactions', :action => 'index'
    

    这有帮助吗?

    【讨论】:

    • 虽然这样可行,但我不喜欢让两个控制器做几乎相同的事情的想法。我找到了更好的解决方案(请参阅我的答案)
    【解决方案2】:

    我的 routes.rb 现在包括以下内容:

    map.resources :transactions, :path_prefix => '/pots/:from_id', :as => :from_transactions
    map.resources :transactions, :path_prefix => '/pots/:to_id', :as => :to_transactions
    

    这意味着,例如,对/pots/123/from_transactions/new 的请求被发送到transactions 控制器,并且params[:from_id] 设置为123。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 2014-06-23
      • 1970-01-01
      相关资源
      最近更新 更多