我使用Rails 5.1和carrierwave 1.1.0。
在我的协会中,fotos属于prendas。
这是我的模特:
class Prenda < ApplicationRecord
has_many :fotos, inverse_of: :prenda, dependent: :destroy
accepts_nested_attributes_for :fotos
validates :....
end
fotos模型:
class Foto < ApplicationRecord
mount_uploader :file, FileUploader
belongs_to :prenda, inverse_of: :fotos
validates :file, presence: true, file_size: { less_than: 1.megabytes }
end
及其控制者:
class PrendasController < ApplicationController
before_action :authenticate_user!, only: [:new, :create, :edit, :update, :destroy]
def index
@prendas = Prenda.all
end
def show
@prenda = Prenda.find(params[:id])
@fotos = @prenda.fotos.all
end
def new
@prenda = Prenda.new
@foto = @prenda.fotos.build
end
.........
private
def prenda_params
params.require(:prenda).permit(:titulo, :tipo, fotos_attributes: [:file, :file_cache])
end
end
...
class FotosController < ApplicationController
def index
@fotos = Foto.all
end
def show
end
def new
@foto = Foto.new
end
..........
private
def foto_params
params.require(:foto).permit(:file, :file_cache)
end
end
形式:
%= bootstrap_form_for @prenda do |f| %>
<% if @prenda.errors.any? %>
<%= f.alert_message "Favor correjir los errores debajo." %>
<% end %>
<p>
<%= f.label :titulo, 'Titulo' %><br>
<%= f.text_field :titulo %>
</p>
<p>
<%= f.label :tipo, 'Tipo' %><br>
<%= f.text_field :tipo %>
</p>
<p>
<strong>Fotos:</strong>
<% if @fotos %>
<% @fotos.each do |foto| %>
<%= image_tag foto.file.thumb.url %>
<% end %>
<% end %>
</p>
<p>
<%= f.label :file, 'Agregar Imágen' %><br>
<%= f.file_field :file %>
<%= f.hidden_field :file_cache %>
</p>
<p> <%= f.submit "Guardar", class: "btn btn-primary"%> </p>
<% end %>
在这种情况下,我收到错误:
Prendas#new
中的NoMethodError显示/home/mateo/Tienda/app/views/prendas/_form.html.erb第55行:
未定义的方法`file_cache&#39;对于#Prenda:0x00000003a795b0
请帮忙!
我做错了什么?
我看到错误消息是针对父对象&#34; Prenda&#34;没有&#34;照片或文件&#34;但是,我应该如何在表格中实例化PrendasController中构建的@foto?
谢谢,马特奥。
答案 0 :(得分:0)
文件是Foto模型的字段,它是通过嵌套属性提交的,所以我认为你应该使用它:
<p>
<%f.fields_for fotos_attributes do |foto| %>
<%= foto.label :file, 'Agregar Imágen' %><br>
<%= foto.file_field :file %>
<%= foto.hidden_field :file_cache %>
<%end%>
</p>
并且无需构建@foto = @prenda.fotos.build
这个。
你可以试试这个。并且错误显示在第55行,所以您可以显示第55行代码。
感谢。