2010-08-29 62 views
0

嘿,我有一堆窗體,用於不同的控制器都在同一頁上。這是因爲它們堆疊在一起,這是編輯它們的最佳方式。Rails 2.3.8 form_for partials不會產生正確的動作url

我使用泛音包括的每個形式進入視圖,傳遞當地人爲對象和網址參數通過的form_for

第一(頂層)被用於形成局部:

- form_for :person, local_assigns[:obj], :url => local_assigns[:url] do |person_form| 
    = person_form.error_messages 

    %p 
    = person_form.label :first_name 
    = person_form.text_field :first_name 
    %p 
    = person_form.label :last_name 
    = person_form.text_field :last_name 
    %p 
    = person_form.submit 'Save' 
    - if local_assigns[:obj] 
     = link_to 'Destroy', local_assigns[:obj], :confirm => 'Are you sure?', :method => :delete 

其經由

= render :partial => 'person_form', :locals => { :url => { :controller => 'people', :action => 'create' }, :obj => @person } 

納入視圖創建一個新的個人,和

= render :partial => 'person_form', :locals => { :url => "people/update/#{person.id}", :obj => person } 

該塊內:

- Person.all.each do |person| 

編輯現有的所有的人。

我的問題是,除了第一個(頂級)人員創建和編輯表單之外,每個表單都會將操作設置爲當前控制器。

所有其他形式的form_for泛音非常相似:

- form_for :day, local_assigns[:obj], local_assigns[:url] do |day_form| 
    = day_form.error_messages 

    %p 
    = day_form.label :effective_date, 'Date' 
    = day_form.datetime_select :effective_date 
    = day_form.label :person_id 
    = day_form.collection_select(:person_id, Person.all, :id, :full_name, { :selected => local_assigns[:ref] ? local_assigns[:ref].id : 1 }) 
    %p 
    = day_form.submit 'Save' 
    - if local_assigns[:obj] 
     = link_to 'Destroy', local_assigns[:obj], :confirm => 'Are you sure?', :method => :delete 

通過

= render :partial => 'day_form', :locals => { :url => { :controller => 'days', :action => 'create' }, :obj => @day, :ref => person } 

爲創建表單,並

= render :partial => 'day_form', :locals => { :url => "days/update/#{day.id}", :obj => day, :ref => person } 

的編輯形式包括在內。

這兩個模型,人和日,由具有許多人:天和天屬於:人連接在一起。關聯設置正確且工作正常,問題是使用不同控制器渲染所有表單以生成正確的動作url。

有什麼建議嗎?

(我使用haml btw)

+0

http://pastie.org/1124904,HTTP: //pastie.org/1124916演示正在嘗試完成的正確方法。控制器可能看起來像def update; garage = Garage.find(params [:id]); garage.update(params [:garage]); end – jvatic 2010-08-29 22:29:29

回答

0

你的語法對我來說似乎有點奇怪。如果將實際對象傳遞給form_for,它會根據它是新記錄還是現有記錄自動計算向何處提交表單。

像這樣的東西應該做的伎倆爲您提供:

# In your controller 
# Create a new record 
@new_person = Person.new 
# And pull out all existing records for editing 
@all_people = Person.all 


# In whatever view is wrapping your form partials 
%h1 Create a new person 
= render :partial => 'person_form', :locals => { :person => @new_person } 

%h1 Or edit any of the existing people 
= render :partial => 'person_form', :collection => @all_people, :as => :person 


# In your `person_form` partial 
form_for person do |person_form| 
    ... # your usual code here 

在代碼,您撥打form_for最後一行,您在實際的對象傳遞 - 和URL提交表單,以推斷根據記錄是新的(如@new_person)還是已經存在於數據庫中(如@all_people中的每個人一樣)。

這有道理嗎?我是否正確理解了這個問題?

0

如果PersonDay被指定爲路徑中的資源,form_for可以從對象中推斷出正確的控制器和操作。例如...

在您的個人部分:

- form_for @person do |f| 
    = f.error_messages 
    = # ...etc... 

在你一天的部分(如人的has_many天):

- form_for [@person, @day] do |f| 
    = f.error_messages 
    = # ...etc...