Paperclip多态模型上的嵌套属性未保存(RAILS)

时间:2016-06-27 21:10:46

标签: ruby-on-rails polymorphism paperclip nested-attributes strong-parameters

我不能为我的生活弄清楚为什么我的回形针附件的某些属性不会通过嵌套属性保存到数据库中。我的帖子有一个附件,但是:附件属性的媒体参数没有被保存,但正在创建附件对象。我想我有一些东西搞砸了我的强力传递的方式。提前谢谢。

NIL Params

  media_file_name: nil, media_content_type: nil, media_file_size: nil, media_updated_at: nil>

IRB:

 irb(main):001:0> p = Post.last
      Post Load (0.1ms)  SELECT  "posts".* FROM "posts"  ORDER BY "posts"."id" DESC LIMIT 1
    => #<Post id: 40, body: "test info", expiration: 1467065130586, created_at: "2016-06-27 21:05:41", updated_at: "2016-06-27 21:05:41">
    irb(main):002:0> p.attachment
      Attachment Load (0.2ms)  SELECT  "attachments".* FROM "attachments" WHERE "attachments"."attachable_id" = ? AND "attachments"."attachable_type" = ? LIMIT 1  [["attachable_id", 40], ["attachable_type", "Post"]]
    => #<Attachment id: 26, attachable_id: 40, attachable_type: "Post", created_at: "2016-06-27 21:05:41", updated_at: "2016-06-27 21:05:41", media_file_name: nil, media_content_type: nil, media_file_size: nil, media_updated_at: nil>
    irb(main):003:0> 

架构:

ActiveRecord::Schema.define(version: 20160627165514) do

  create_table "attachments", force: :cascade do |t|
    t.integer  "attachable_id"
    t.string   "attachable_type"
    t.datetime "created_at",         null: false
    t.datetime "updated_at",         null: false
    t.string   "media_file_name"
    t.string   "media_content_type"
    t.integer  "media_file_size"
    t.datetime "media_updated_at"
  end

  add_index "attachments", ["attachable_type", "attachable_id"], name: "index_attachments_on_attachable_type_and_attachable_id"

  create_table "posts", force: :cascade do |t|
    t.text     "body"
    t.integer  "expiration", limit: 8
    t.datetime "created_at",           null: false
    t.datetime "updated_at",           null: false
  end

end

发布模型:

class Post < ActiveRecord::Base
    has_one :attachment, as: :attachable, dependent: :destroy
    accepts_nested_attributes_for :attachment
end

后控制器:

class PostsController < ApplicationController

    def show
        #I don't need this.
    end

    def index
        @posts = Post.all
    end

    def new
        @post = Post.new
        @post.build_attachment
    end

    def create
        @post = Post.new(post_params)
        @post.build_attachment
        if @post.save
            respond_to do |format|
                format.html {redirect_to(posts_path, notice:"Post succesfully created")}
                format.js  
            end
        else
            render :new
        end
    end


    private

    def post_params
      params.require(:post).permit(:body,:expiration, attachment_attributes: [:media])
    end


end

附件模型:

class Attachment < ActiveRecord::Base

    belongs_to :attachable, polymorphic:true
    has_attached_file :media
end

HTML表格:

    <%=form_for(@post, url: posts_path, html:{multipart:true}) do |form|%>
        <%=form.text_area :body%>

        <%=fields_for(:attachment) do |ff|%>
            <%= ff.file_field :media %>
        <%end%>


    <%=form.hidden_field :expiration%>
    <%=form.submit "Post", class: "post-submit-button"%>



<%end%>

Log Dumb:

Started POST "/posts" for ::1 at 2016-06-27 16:05:41 -0500
Processing by PostsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"/b54OJOBJIaR551MAHDujCxjciI7OAx93EQAVrugCz0xtYnafaSH4widYOftZJUbDHLfmI6jly5eG5AxCCNJbQ==", "post"=>{"body"=>"test info", "expiration"=>"1467065130586"}, "attachment"=>{"media"=>"IMG_1004.jpg"}, "commit"=>"Post"}
   (0.1ms)  begin transaction
  SQL (0.3ms)  INSERT INTO "posts" ("body", "expiration", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["body", "test info"], ["expiration", 1467065130586], ["created_at", "2016-06-27 21:05:41.321484"], ["updated_at", "2016-06-27 21:05:41.321484"]]
  SQL (0.1ms)  INSERT INTO "attachments" ("attachable_type", "attachable_id", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["attachable_type", "Post"], ["attachable_id", 40], ["created_at", "2016-06-27 21:05:41.323335"], ["updated_at", "2016-06-27 21:05:41.323335"]]
   (1.4ms)  commit transaction
Redirected to http://localhost:3000/posts
Completed 302 Found in 8ms (ActiveRecord: 1.9ms)


Started GET "/posts" for ::1 at 2016-06-27 16:05:41 -0500
Processing by PostsController#index as HTML
  Rendered layouts/_user_menu.html.erb (0.1ms)
  Rendered posts/index.html.erb within layouts/application (1.8ms)
Completed 200 OK in 26ms (Views: 25.8ms | ActiveRecord: 0.0ms)

1 个答案:

答案 0 :(得分:0)

您没有将fields_for绑定到您的表单。试试这个:

<%=form_for(@post, url: posts_path, html:{multipart:true}) do |form|%>
  <%=form.text_area :body%>
  <%= form.fields_for(:attachment) do |ff|%>
    <%= ff.file_field :media %>
  <% end %>
  <%=form.hidden_field :expiration%>
  <%=form.submit "Post", class: "post-submit-button"%>
<%end%>