2017-08-22 2 views
0

Ich verwende Büroklammer in verschachtelten Attributen und ich bin mir nicht sicher, was ich vermisse. In der Ansicht des Formulars fehlt die Option zum Hochladen von Dateien.Fehlendes Dateifeld in verschachtelten Attributen

Formular

<%= form_with(model: news, local: true, html: { multipart: true }) do |form| %> 
    <%= form.fields_for :images do |img| %> 
    <%= img.file_field :img, multiple: true %> 
    <% end%> 
<% end %> 

Modelle

class News < ApplicationRecord 
    has_many :images, dependent: :destroy 
    accepts_nested_attributes_for :images, allow_destroy: true 
end 

class Image < ApplicationRecord 
    belongs_to :news 

has_attached_file :img, :styles => { :show => "600x600>" }, size: { less_than: 2.megabytes } 
    validates_attachment_content_type :img, :content_type => ["image/jpg", "image/jpeg", "image/gif", "image/png"] 
end 

-Controller

class NewsController < ApplicationController 
    def new 
    @news = News.new 
    @news.images.build 
    end 

    def create 
    @news = News.new(news_params) 

    respond_to do |format| 
     if @news.save 
     format.html { redirect_to @news, notice: 'News was successfully created.' } 
     format.json { render :show, status: :created, location: @news } 
     else 
     format.html { render :new } 
     format.json { render json: @news.errors, status: :unprocessable_entity } 
     end 
    end 
    end 


    private 
    def set_news 
     @news = News.find(params[:id]) 
    end 

    def news_params 
     params.require(:news).permit(:title, :description, :category, images_attributes: [:id, :img, :news_id, :_destroy]) 
    end 
end 

Wenn ichändernbis :image in Form das Feld erscheint, aber dann gibt einen Fehler auf Vorlage:

Unpermitted parameter: :image 

Antwort

1

In Ihrem Fall müssen Sie ein record_object zum um fields_for

<%= form.fields_for :images, @news.images.build do |img| %> 
    <%= img.file_field :img, multiple: true %> 
<% end%> 

auch explizit zu übergeben senden Sie mehrere Werte für img, sollte es ein Array in den zulässigen Parametern sein. Sie sollten die news_params unter

ändern
def news_params 
    params.require(:news).permit(:title, :description, :category, images_attributes: [:id, :news_id, :_destroy, img: []]) 
end 
+0

Funktioniert! Seltsam, warum muss man in Rails 5 die Build-Methode in der Form aufrufen und nicht den Controller unter New? – DollarChills

+0

@DollarChills Ich denke, es hat mit 'Modell: Nachrichten' in' Form_with' zu tun. Um neugierig zu sein, versuchen Sie, 'fields_for' so zu halten, wie es vorher war, und ändern Sie' <% = form_with (model: news, local: true, html: {multipart: true}) do | %> 'bis' <% = form_with (Modell: @news, lokal: true, html: {multipart: true}) do | form | %> ' – Pavan

+0

Diese Methode funktioniert besser. Dies listet alle Bilder beim Bearbeiten auf, während die andere Methode dies nicht tut. Frage mich, ob es Änderungen an diesen verschachtelten Attributen mit Rails 5 gibt? – DollarChills

Verwandte Themen