2010-05-05 2 views
0

Предположим, у меня есть приложение для простого списка дел. Приложение содержит две модели:Rails: обновление элемента вместе со связанными объектами

  • списки (имеет владелец и описание)
  • элементов (имеет имя и должную дату), которые принадлежат к определенному списку

Я хотел бы иметь один экран редактирования для списка, в котором я обновляю атрибуты списка (например, описание), а также создаю/удаляю/изменяю связанные элементы. Должна быть одна кнопка «Сохранить», которая будет совершать все изменения. Если не было нажато сохранение, любое изменение в списке и предметы следует забыть.

Я не смог найти изящную передовую практику для этого. Был бы очень признателен за любые предложения и/или ссылки на существующие реализации.

ответ

3

Вы должны быть в состоянии сделать эту работу с accepts_nested_attributes_for на has_many ассоциации. Цитируя Rails API docs:

Рассмотрим элемент, который имеет ряд сообщений:

class Member < ActiveRecord::Base 
    has_many :posts 
    accepts_nested_attributes_for :posts 
    end 

Теперь вы можете установить или обновить атрибуты на соответствующей почтовой модели через устанавливается атрибут хэш. Для каждого хэша не имеет ключа id, новая запись будет создана, если хеш также содержит ключ _delete, который оценивает как true.

params = { :member => { 
    :name => 'joe', :posts_attributes => [ 
     { :title => 'Kari, the awesome Ruby documentation browser!' }, 
     { :title => 'The egalitarian assumption of the modern citizen' }, 
     { :title => '', :_delete => '1' } # this will be ignored 
    ] 
    }} 

    member = Member.create(params['member']) 
    member.posts.length # => 2 
    member.posts.first.title # => 'Kari, the awesome Ruby documentation browser!' 
    member.posts.second.title # => 'The egalitarian assumption of the modern citizen' 

Там также хорошее объяснение в Railscast 196, который показывает, как настроить формы с вложенными атрибутами.

+0

Это Railscast попадает в точку. Для будущего использования здесь приведена ссылка на текстовую версию: http://asciicasts.com/episodes/196-nested-model-form-part-1 – shmichael

0

попробовать что-то вроде следующего

@list = List.find(params[:id]) 
@item = @list.item 
@list.attributes=params[:list]  
@item.attributes=params[:item]  
# (@list.valid? & @item.valid?) this is used for retrieving error message for both list and item 
if (@list.valid? & @item.valid?) && @list.save && @item.save 
    flash[:notice] = "List updated successfully." 
    redirect_to :action => "list_details", :id => @list.id 
else 
    return(render (:action => 'edit_list', :id =>@list.id)) 
end 
Смежные вопросы