嵌套表单呈现未知属性错误

时间:2015-11-09 17:50:49

标签: ruby-on-rails forms nested params

我使用宝石嵌套形式https://github.com/ryanb/nested_form来创建包含多张图片的平面。 Flat模型有很多图片。 表格看起来像这样:

<%= simple_nested_form_for @flat do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :name %>
    <%= f.fields_for :pictures do |pictures_form| %>
      <%= pictures_form.file_field :image %>
      <%= pictures_form.link_to_remove ('<i class="fa fa-trash"></i>').html_safe %>
    <% end %>
     <%= f.link_to_add ('<i class="fa fa-plus"></i>').html_safe, :pictures %>
  </div>
  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

我的控制器创建动作:

  def create
    @flat = Flat.new(flat_params)
    authorize @flat
    @flat.user = current_user
    @flat.pictures.build

    if @flat.save
      redirect_to flat_path(@flat), notice: 'Flat was successfully created.'
    else
      render :new
    end
  end

和我的flat_params:

 def flat_params
      params.require(:flat).permit(:name, pictures_attributes: [:id, :image, :_destroy])
    end

我总是收到以下错误: 图片的未知属性'image'。

我使用宝石回形针进行图像上传以下是我的表格图片在我的模式中的显示方式:

create_table "pictures", force: :cascade do |t|
    t.datetime "created_at",         null: false
    t.datetime "updated_at",         null: false
    t.string   "image_file_name"
    t.string   "image_content_type"
    t.integer  "image_file_size"
    t.datetime "image_updated_at"
    t.integer  "flat_id"
  end

有什么问题?

1 个答案:

答案 0 :(得分:0)

为什么你在create方法中构建?这是您仅保存的地方:

  def new
    @flat = Flat.new
    @flat.pictures.build #-> pictures.build should be in the new method only
  end

  def create
    @flat = Flat.new flat_params
    @flat.user = current_user

    authorize @flat

    if @flat.save
      redirect_to @flat, notice: 'Flat was successfully created.'
    else
      render :new
    end
  end

除了上述(pictures.build)之外,您的代码看起来还不错。

可能的另一个问题是您没有在Picture模型中包含Paperclip参考。您需要具备以下条件:

#app/models/picture.rb
class Picture < ActiveRecord::Base
   has_attached_file :image #-> + any styling options etc
end

从您提供的代码中,我就可以提供。