具有双关联的模型的嵌套路由

时间:2009-12-30 02:12:13

标签: ruby-on-rails routing

在玩具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列出了来自pot 123,
  • 的所有交易
  • /pots/123/to_transactions/new提供新的交易表单,to_id设置为123

这可能吗?感恩的任何帮助等等。

2 个答案:

答案 0 :(得分:0)

我想说一个干净的管理方式是所有与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'

这有帮助吗?

答案 1 :(得分:0)

我的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.