我得到了什么: 安装了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。我是铁轨上的红宝石和红宝石的新手,请不要责怪;)
答案 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 %>
我没有测试过,但应该足够接近。