Rails4。上传应属于模型的多个文件

时间:2013-12-22 07:26:35

标签: ruby-on-rails carrierwave simple-form

我得到了什么: 安装了Rails 4,carrierwave和simple_form gems。

图像

class Image < ActiveRecord::Base
  mount_uploader :image, ImageUploader
  belongs_to :portfolio, foreign_key: :portfolio_id

  THUMB_WIDTH = 220
end

组合:

class Portfolio < ActiveRecord::Base
  has_many :images
end

投资组合控制人:

class PortfolioController < ApplicationController

  def new # render a form to add a portfolio entry
    @portfolio = Portfolio.new
  end

  def create

    puts ">>>"
    puts portfolio_params.inspect
    puts "<<<"
    entry = Portfolio.new(portfolio_params)
    entry.save
    images = Image.create(portfolio_params[:images])
    images.portfolio = entry
    images.save
  end

  private
    def portfolio_params
      params.require(:portfolio).permit(:title, :description, images: [:image])
    end

end

投资组合创建表格(简化):

<%= simple_form_for @portfolio, method: :post, html: { multipart: true } do |f| %>
    <%= f.input :title %>
    <%= f.input :description %>
    <!-- nested images -->
    <%= f.simple_fields_for :images do |i| %>
        <%= i.input :image, as: :file %>
        <%= i.input :image, as: :file %> <!-- I want 2 files -->
    <% end %>
<% end %>

问题是:图像应该作为数组提交,第二个问题是强参数。我一直在努力解决这个问题很长一段时间,尝试了几种方法来允许参数不会出现任何异常并使表单正常工作。

我在这里做错了什么?

P.S。我是铁轨上的红宝石和红宝石的新手,请不要责怪;)

1 个答案:

答案 0 :(得分:3)

在您的投资组合模型中,您需要添加:

accepts_nested_attributes_for :images

然后在你的控制器中,执行:

def new
  @portfolio = Portfolio.new
  @portfolio.images.build
  @portfolio.images.build # you wanted 2
end

def create
  @portfolio = Portfolio.create(portfolio_params)
  redirect_to @portfolio
end

private

def portfolio_params
  params.require(:portfolio).permit(:title, :description, images_attributes: [:image])  
end

然后在你看来:

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

我没有测试过,但应该足够接近。

相关问题