2011-01-12 16 views
1

在瑞安貝茨的first episode on complex forms,他增加了以下的模式:模型在Rails中訪問哪些信息?

# models/project.rb 
has_many :tasks 

def task_attributes=(task_attributes) 
    task_attributes.each do |attributes| 
    tasks.build(attributes) 
    end 
end 

我以前從來沒有想過這個,但如何在項目模型知道什麼是「任務」,它的工程實例?這是來自has_many協會嗎?是不是像這樣,當項目運行時,我正在查看一個項目,這是「活動」對象,所以project.rb知道我們指的是哪個Project對象,因此它知道任務實際上是some_current_project.tasks? (我明顯在這裏抓着吸管。)

此外,如果有人會指出我解釋其他問題,如這一個的一些參考,我真的很感激它。

我希望我的問題很清楚。如有需要,請在評論中提供更多說明。

請注意:我知道活動記錄處理CRUD操作,並且對象對應表中的行等。這些只是活動記錄的描述。我正在尋找它在項目運行時的工作原理。我現在也是構造MVC,但我似乎無法找到關於Rails哪些信息發送到哪裏的詳細解釋。

+0

任務與Project模型相關,因此在模型內部創建任務時,ID會自動設置。 – apneadiving 2011-01-12 19:28:53

+0

...通過什麼自動設置?什麼時候?我可以改變它嗎?如果是這樣,怎麼樣?如果不是,爲什麼? – user5243421 2011-01-12 19:53:47

回答

1

(不知道我完全理解你的問題,隨時讓我知道,如果是這樣的話。)

Rails的模式基本上是持久化到數據庫的Ruby類。所以它在大多數情況下就像一個普通的紅寶石對象,其中混入了一些數據庫魔法。

您告訴rails要加載哪個項目實例(例如通過提供id),並從數據庫加載數據。

然後,當你調用project.tasks是當奇蹟發生了:該Project模型沒有tasks方法,所以它會觸發Ruby的method_missing方法。然後這會將相關記錄加載到模型實例中,並通過一個rails對象提供對它們的訪問。

由於project有許多task S,軌知道它應該看看tasks數據庫,其中project_id等於project模型id屬性加載行。

簡而言之,ruby元編程和猴子修補的可能性使許多rails的魔法成爲可能。


(編輯有關路由問題。)

當你要編輯的項目數13,你去,看起來像www.mysite.com/projects/13/edit的URL。如果您在config目錄中查看routes.rb,您會看到(在Rails3中)resources :projects Rails所做的是爲您設置各種路徑。神奇的背後,編輯路徑看起來像

get '/projects/:id/edit' => 'projects#edit' 

這基本上說,「當用戶希望看到www.mysite.com/projects/13/edit,送他去edit行動在projects控制器和設置id參數指向該位置的值。

然後在你的控制器,你會加載具有

@project = Project.find(params[:id]) 

合適的項目以類似的方式,你可以這樣做(這是一個愚蠢的例子):

routes.rb,把

get '/projects/:id/edit_name/:name' => 'projects#edit' 

然後在你控制器

@project = Project.find(params[:id]) 
@project.name = params[:name] 

因此,rails基本上使用魔術來分配URL中的值給您可以在控制器中使用的參數。您可以在此處閱讀有關路由的更多信息:http://guides.rubyonrails.org/routing.html

相關問題