2010-08-29 2 views
0

Эй, у меня есть куча форм для разных контроллеров на одной странице. Это потому, что theres куча моделей, которые складываются друг на друга, и это лучший способ их редактировать.Rails 2.3.8 form_for partials не генерирует правильный URL-адрес действия

Я использую партиалы, чтобы включить каждую форму в поле зрения, передавая местные жители для объекта и URL-адрес Params, которые будут использоваться 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| 

редактировать все существующие люди.

Моя проблема заключается в том, что каждая форма, исключая первого (верхнего уровня) человека, создает и редактирует формы, действие устанавливается на текущий контроллер.

The 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 } 

для редактирования форм.

Две модели, Person and Day, соединены вместе лицом, имеющим много дней и дней, принадлежащих: лицу. Все ассоциации настроены правильно и работают, проблема заключается в рендеринге всех форм с разными контроллерами для создания правильного URL-адреса действия.

Любые предложения?

(я использую HAML кстати)

+0

http://pastie.org/1124904, HTTP: //pastie.org/1124916 Продемонстрируйте правильный способ делать то, что я пытаюсь выполнить. Контроллер может выглядеть как def update; гараж = Garage.find (params [: id]); garage.update (params [: garage]); end – jvatic

ответ

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

Если Person и Day указаны в качестве ресурсов на ваших маршрутах, form_for может вызывать правильный контроллер и действие от объекта. Например ...

В Вашем лице парциального:

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

В свой день парциальные (где Person has_many дней):

- form_for [@person, @day] do |f| 
    = f.error_messages 
    = # ...etc... 
Смежные вопросы