嵌套模型使用simple_form和paperclip

时间:2016-02-22 09:19:55

标签: ruby-on-rails ruby-on-rails-4 paperclip simple-form

[这可能是一个简单的问题,但我找不到解决方案]

我正在尝试使用新数据更新现有记录并将一些图像添加到该记录(通过回形针),但是,我的代码根本不显示paperclip字段。

I've followed this example并尝试使用this solutions,但没有任何效果。

我有两个,型号HotelHotelImage

hotel.rb

class Hotel < ActiveRecord::Base
  extend FriendlyId
  friendly_id :slug_candidates, use: :slugged

  validates :name, presence: true
  validates :location, presence: true

  has_many :hotel_images
  accepts_nested_attributes_for :hotel_images

  def slug_candidates
    [
      [:name, :location],
    ]
  end
end

hotel_image.rb

class HotelImage < ActiveRecord::Base
  belongs_to :hotel

  #rails generate paperclip hotel_image image

  has_attached_file :image, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
  validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
end

edit.html.erb

<%= simple_form_for @hotel, :url => admin_hotel_path, method: :put, html: { multipart: true } do |f| %>
  <%= f.error_notification %>
  <%= f.input :name %>
  <%= f.input :location %>

  <%= f.simple_fields_for :hotel_images do |ff| %>
    <%= ff.input :image, as: :file %>
  <% end %>

  <%= f.button :submit %>
<% end %>

hotels_controller.rb

#other code

def update
  @hotel = Hotel.friendly.find(params[:slug])

  if @hotel.update(hotel_params)
    redirect_to admin_hotels_path, notice: 'Hotel was successfully updated.'
  else
    render :edit
  end
 end

private

def hotel_params
  params.require(:hotel).permit(:name, :location, :admin_id, hotel_images_attributes: [:hotel_id, :image])
end

这是表单的打印屏幕,您可以在其中看到缺少回形针字段:

preview

但是,当我将f.simple_fields_for :hotel_images更改为f.simple_fields_for :foobars时,会显示回形针字段:

example2

注意namelocation属性更新正常。

1 个答案:

答案 0 :(得分:1)

def update
  @hotel = Hotel.friendly.find(params[:slug])
  if @hotel.update(hotel_params)
    redirect_to admin_hotels_path, notice: 'Hotel was successfully updated.'
  else
    render :edit
  end
end

def edit
  @hotel_images = @hotel.hotel_images.present? ? @hotel.hotel_images : @hotel.hotel_images.build
end

试试此代码