2014-08-07 4 views
0

В моем приложении у меня есть проект, каждый пользователь проекта может загрузить много активов. Загрузка выполняется с помощью несущей. У меня есть два вопроса:Контроллер обновления не сохраняет прикрепленный файл, ruby ​​on rails

1) есть ли лучший способ написать метод создания?

2) Как мне изменить мой метод обновления для обновления прикрепленных файлов

Модель, project.rb

class Project < ActiveRecord::Base 

    belongs_to :user 
    has_many :assets 
end 

режим активов, asset.rb

class Asset < ActiveRecord::Base 

    belongs_to :project 
    belongs_to :user 
    mount_uploader :attachment, AttachmentUploader #CarrierWave 


end 

Этот мой метод Create, который отлично работает

здесь метод Update

def update 
    respond_to do |format| 
    if @project.update(project_params) 

      format.html { render :edit } 
      format.json { render json: @project.errors, status: :unprocessable_entity } 

    else 
    format.html { render :edit } 
    format.json { render json: @project.errors, status: :unprocessable_entity } 
    end 
end 

ответ

0

Вы можете использовать метод accepts_nested_attributes_for встроенный в активную запись легко обрабатывать создание, обновление и уничтожение вложенных моделей

http://railscasts.com/episodes/196-nested-model-form-revised?view=asciicast

редактированиякА ВОПРОСА ИЗМЕНЕНИЕ

Вы, кажется, прошли много изменений к своему первоначальному вопросу, позвольте мне посмотреть, смогу ли я помочь вам разобраться в чем-то.

Предположим, что ваш класс активов имеет столбец с именем вложение, и у вас есть класс загрузчика несущей, называемый AttachmentUploader. Вы можете установить этот класс в класс активов, как вы показываете в вашем вопросе

mount_uploader :attachment, AttachmentUploader #CarrierWave 

Вы не показ разметки форм в вопросе, но основанный на методе project_params вашего контроллера, кажется, что вы ожидаете свойство asset_attributes. Вы захотите убедиться, что ваша форма правильно построит этот массив, наиболее легко выполняемый с помощью команды fields_for. Если запутались этой части относятся к этому вопросу Rails 4 Nested Attributes Unpermitted Parameters

В основном это должно выглядеть так

проектов/_form.html.erb

<%= form_for @project, :html => {:multipart => true} do |f| %> 
    <%= f.error_messages %> 

    <%= f.fields_for :assets do |builder| %> 
    <%= render 'assets_fields', :f => builder %> 
    <% end %> 
    <p><%= f.submit %></p> 
<% end %> 

проекты/_assets_fields.html.erb

<p> 
    <%= f.file_field :attachment %> 
</p> 

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

accepts_nested_attributes_for :assets, :allow_destroy => true 

Просто звоните

project.save 

или

project.update 

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

+0

Спасибо, я сменил модели и все еще у меня проблема. Я обновил вопрос – user1876128

+0

, основываясь на вашем комментарии. Я попытался использовать nested_attributes вместе с ассоциацией Polymorphic. все еще это не спасает я ahev детали в этом сообщении Rails: (http://stackoverflow.com/questions/25186981/rails-polymorphic-assosiation-and-accepts-nested-attributes) – user1876128

Смежные вопросы