Rails 2.3.8 form_for partials не генерирует корректный URL действия - PullRequest
0 голосов
/ 29 августа 2010

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

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

Ответы [ 2 ]

0 голосов
/ 30 августа 2010

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

В вашем лице частично:

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

В ваш частичный день (где Person has_many Days):

- form_for [@person, @day] do |f|
  = f.error_messages
  = # ...etc...
0 голосов
/ 30 августа 2010

Ваш синтаксис кажется мне немного странным. Если передать фактический объект в 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).

Имеет ли это смысл? Правильно ли я понял проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...