1

파일을 처리하기 위해 Active cocoon 양식을 사용하여 일부 이미지를 모델에 저장하려고합니다.Rails 5.2 누에 고치 모양의 활성 저장소

저는 많은 사과가있는 농부 클래스를 가지고 있습니다. 농부는 농부 양식을 통해 다양한 종류의 사과 각각에 대해 여러 이미지를 추가 할 수 있습니다. 농부 컨트롤러 내부

class Farmer < ActiveRecord::Base 
    has_many :apples, inverse_of: :farmer 
    accepts_nested_attributes_for :apples, allow_destroy: true, 
           reject_if: :all_blank 
end 

class Apple < ActiveRecord::Base 
    has_many_attached :apple_images 
end 

내가 가진 :

class Farmer < ApplicationController 


    def update 
    @farmer = Farmer.find(params[:farmer_id]) 

    if @farmer.valid? 
     @farmer.update!(farmer_params) 
     redirect_to edit_farmer_path(farmer_id: @farmer.id) 
    else 
     ... 
     ... 
    end 
    end 

    private 
    def farmer_params 
    params.require(:farmer).permit(
     :farmer_name, 
     apples_attributes: [ 
     :id, 
     :color, 
     :size, 
     :_destroy 
     ]) 
    end 
end 

내보기 난 그냥 내 누에 고치 필드에이 추가

<div class="form-field"> 
    <%= f.label :apple_images, "Please upload apple images" %> 
    <%= f.file_field :apple_images, multiple: true, data: { validates: {required: {}} } %> 
</div> 
이제 사과를 저장합니다 누에 고치 번 accepts_nested_attributes_for 호출을 사용하여 속성

파머 개체가 저장됩니다. 양식에 apple_images을 추가 할 때까지이 모든 작업이 정상적으로 작동합니다.

Active Storage 읽어보기에서 읽어보기 항목을 저장 한 직후 파일을 첨부해야합니다.

당신이 읽을 수있는 당신이 컨트롤러에 하나의 이미지를 원하는 경우 readme here

하지만 짧은이 수행

def create 
    message = Message.create! params.require(:message).permit(:title, :content) 
    message.images.attach(params[:message][:images]) 
    redirect_to message 
end 

이를 :

#inside an update method 
Current.user.avatar.attach(params.require(:avatar)) 

또는 여러 이미지를 원하는 경우 이미지가 컨트롤러에 저장되는 모델에 직접있을 때 상당히 간단합니다. 처음에는

, 나는 그렇게 같이 PARAMS에 apple_images를 추가하는 것만 큼 쉽게 할 수있다 생각 :

def farmer_params 
    params.require(:farmer).permit(
     :farmer_name, 
     apples_attributes: [ 
     :id, 
     :color, 
     :size, 
     :apple_images, 
     :_destroy 
     ]) 
    end 

을하지만,이 오류가 반환됩니다

ActiveModel::UnknownAttributeError - unknown attribute 'apple_images' for Apple.: 

내가 사용에 대해 생각하고를 apple 객체가 업데이트/생성 된 후에 이미지를 첨부하기위한 사과 모델의 after_save 콜백. 나는 이것을 달성하는 방법을 모르지만.

<ActionController::Parameters {"utf8"=>"✓", "_method"=>"patch", 
    "farmer"=>{"farmer_name"=>"billy the farmer", "apples_attributes"=> 
    {"0"=>{"color"=>"Green", 
      "size"=>"A", 
      "apple_images"=>[#<ActionDispatch::Http::UploadedFile:0x007f9e8aa93168 @tempfile=#<Tempfile:/var/folders/n7/65r5561n44q0w4bdnmw42l880000gn/T/RackMultipart20171211-87415-1m2w7gh.png>, @original_filename="Screen Shot 2017-12-07 at 09.13.28.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"farmer[apples_attributes][0][apple_images][]\"; filename=\"Screen Shot 2017-12-07 at 09.13.28.png\"\r\nContent-Type: image/png\r\n">, 
          #<ActionDispatch::Http::UploadedFile:0x007f9e8aa93118 @tempfile=#<Tempfile:/var/folders/n7/65r5561n44q0w4bdnmw42l880000gn/T/RackMultipart20171211-87415-1gdbax2.jpeg>, @original_filename="WhatsApp Image 2017-12-06 at 1.23.35 PM.jpeg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"farmer[apples_attributes][0][apple_images][]\"; filename=\"WhatsApp Image 2017-12-06 at 1.23.35 PM.jpeg\"\r\nContent-Type: image/jpeg\r\n">], 
     "_destroy"=>"false", "id"=>"4"}}}, 
    "commit"=>"Next", 
    "controller"=>"farmer/produce", 
    "action"=>"update", 
    "farmer_id"=>"3"} permitted: false> 
+0

당신의 로그를보고 params/field-names이 실제로 무엇을 통해 왔는지 확인하십시오 ... 질문을 편집하여 거기에 추가하십시오. –

+1

안녕하세요 @TarynEast 나는 params을 추가했습니다. 농부 인'accepts_nested_attributes_for'를 통해 저장 될 사과 매개 변수의 나머지 부분과 함께'apple images'가 움직일 것입니다. ActiveStorage는 내가 믿을만한 사후에 개체에 첨부 된 이미지를 원하고 ActiveStorage는 다형성 테이블을 설정합니다. 사과 속성 외부의 Apple 클래스에 사과 이미지를 전달하여 after_save 콜백을 설정하여 이미지를 첨부 할 수 있는지 궁금합니다. – TheLegend

답변

3

당신은해야 : 약간의 손실을 느낌

, 어떤 아이디어 나 제안이 크게

편집

이는 PARAMS이 업데이트의 시간에 같이 무엇을 이해할 수있을 것이다 (알려진 속성이 Apple이 아니므로) farmer_params에서 apple_images을 제거하십시오. 그러나 그것을 제거하면 이미지가 저장되지 않습니다. 그러나 이것은 작동 방법 (조금 이상한 imho)입니다.당신이 문서를 확인하면

그들은 명시 적으로 images 속성을 무시하고 따로 설정 :

message = Message.create! params.require(:message).permit(:title, :content) 
message.images.attach(params[:message][:images]) 

난 당신이 중첩 된 형태의 설정에서이 문제를 해결하는 방법을 전혀 모르겠습니다. params에있는 모든 사과를 반복하고 apple_images을 설정하려고하면 오류가 발생하기 쉽습니다 (ID가없는 새 사과는 저장 한 것과 어떻게 일치합니까?).

당신은 다음과 같은 방법을 추가하려고 (그리고 허용 PARAMS에서 apple_images 유지) 수 :

def apple_images=(images) 
    self.apple_images.attach(images) 
end 

그러나 apple이 저장하기 전에 작동 있는지 확실하지 않습니다.

+1

고맙습니다. @nathanvda, 고치에서 다른 단계로 이미지 업로드를 이동하여 객체에 직접 추가 할 수 있습니다. 우리가 발견 한 것은 ActiveStorage가 이미지를 저장하기 위해 일종의 익명의 다형성 테이블을 사용하고 있기 때문에 개체의 인스턴스를 저장해야 ID에 액세스 할 수 있으므로 해당 ID의 after_save 콜백에서 일부 작업을 수행해야합니다. 모델. 이 작업을 볼 수있는 유일한 방법은 Cocoon이 객체에 액세스하여 허용 된 중첩 속성에 대한 속성을 전달한 다음 모델 레벨 콜백을 정의하는 몇 가지 방법이있는 경우입니다. 다시 한번 감사드립니다! – TheLegend

+0

매우 합리적인 것 같습니다. 나는 솔직히 일반적으로 동일한 작업을 수행합니다 : 기존 항목에 첨부 파일 만 추가하십시오 (나는 dropzonejs의 큰 팬입니다). – nathanvda