【问题标题】:Using paperclip gem to add an attachment使用回形针宝石添加附件
【发布时间】:2014-04-13 05:36:23
【问题描述】:

我尝试使用回形针 gem 将附件添加到我的联系人模型中。看起来我可以添加附件 - 我可以毫无问题地选择文件。但是,当我创建联系人时,附件不会保存。我知道这一点是因为我可以在 rails 控制台中看到 document_id 为“nil”。

在用于创建新联系人的 _form.html.erb 中,我有:

<%= simple_form_for(@contact, html: {class: "form-inline well", multipart: true}, role: "form") do |f| %>
        <% if @contact.errors.any? %>
          <div id="error_explanation">
            <h2><%= pluralize(@contact.errors.count, "error") %> prohibited this contact from being saved:</h2>

            <ul>
            <% @contact.errors.full_messages.each do |msg| %>
              <li><%= msg %></li>
            <% end %>
            </ul>
          </div>
        <% end %>

        <div class="form-group">

          <%= f.input :name %>
          <%= f.input :category %>
          <%= f.input :area %>
          <%= f.input :phone %>
          <%= f.input :website %>
          <%= f.input :email %>

          <%= f.fields_for :document do |document_fields| %>
            <%= document_fields.input :attachment, as: :file %>
          <% end %>

          <%= f.button :submit, class: "btn-success" %>
        </div>
      <% end %>

我的数据库迁移是:

class CreateDocuments < ActiveRecord::Migration
  def change
    create_table :documents do |t|

        t.integer :user_id
        t.timestamps
    end

    add_index :documents, :user_id
    add_attachment :documents, :add_attachment
    add_column :contacts, :document_id, :integer
  end
end

我的 document.rb 模型是:

class Document < ActiveRecord::Base

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

对于contact.rb 是:

class Contact < ActiveRecord::Base
    belongs_to :user
    belongs_to :document

    accepts_nested_attributes_for :document

    validates :name, presence: true,
                        length: { minimum: 2}

    validates :user_id, presence: true
end

我在 contacts_controller.rb 中的操作是:

    def create
    @contact = current_user.contacts.new(contact_params)

    respond_to do |format|
      if @contact.save
        format.html { redirect_to @contact, notice: 'Contact was successfully created.' }
        format.json { render action: 'show', status: :created, location: @contact }
      else
        format.html { render action: 'new' }
        format.json { render json: @contact.errors, status: :unprocessable_entity }
      end
    end
  end
  def contact_params
    params.require(:contact).permit(:name, :email, :category, :area, :organisation, :website, :phone, :user_id, document_attributes: [:id, :attachment])
   end

  # PATCH/PUT /contacts/1
  # PATCH/PUT /contacts/1.json
  def update

    @contact = current_user.contacts.find(params[:id])
    if params[:contact] && params[:contact].has_key?(:user_id)
      params[:contact].delete(:user_id) 
    end
    respond_to do |format|
      if @contact.update((contact_params))
        format.html { redirect_to @contact, notice: 'Contact was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: 'edit' }
        format.json { render json: @contact.errors, status: :unprocessable_entity }
      end
    end

  end

当我尝试使用附件创建新联系人时,这是我的 heroku 日志:

2014-03-10T23:41:49.594786+00:00 app[web.1]:参数: {"utf8"=>"✓", "authenticity_token"=>"FGitLGkHzfw15yksCusGDvwdb//CgMyOMFh4SS4l63Y=", "联系人"=>{"姓名"=>"Oliver OT", "category"=>"OT", "area"=>"Rockdale", "电话"=>"", "网站"=>"", "电子邮件"=>"", "document_attributes"=>{"附件"=>#, @original_filename="2014-03-03 晚上 9.24.40 截屏.png", @content_type="image/png", @headers="Content-Disposition: form-data; 名称=\“联系人[文档属性][附件]\”;文件名=\“屏幕 于 2014 年 3 月 3 日晚上 9.24.40 拍摄.png\"\r\n内容类型: image/png\r\n">}}, "commit"=>"创建联系人"} 2014-03-10T23:41:49.594786+00:00 应用 [web.1]:参数: {"utf8"=>"✓", "authenticity_token"=>"FGitLGkHzfw15yksCusGDvwdb//CgMyOMFh4SS4l63Y=", "联系人"=>{"姓名"=>"Oliver OT", "category"=>"OT", "area"=>"Rockdale", "电话"=>"", "网站"=>"", "电子邮件"=>"", "document_attributes"=>{"附件"=>#, @original_filename="2014-03-03 晚上 9.24.40 截屏.png", @content_type="image/png", @headers="Content-Disposition: form-data; 名称=\“联系人[文档属性][附件]\”;文件名=\“屏幕 于 2014 年 3 月 3 日晚上 9.24.40 拍摄.png\"\r\n内容类型: image/png\r\n">}}, "commit"=>"创建联系人"}

我不确定如何正确保存附件?

【问题讨论】:

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


    【解决方案1】:

    contact_params 方法移到更新操作之外,以便创建操作可以访问它并将其更改为以下代码。

    def contact_params
      params.require(:contact).permit(:name, :email, :category, :area, :organisation, :website, :phone, :user_id, document_attributes: [:id, :attachment])
    end
    

    上面的代码允许idattachment 参数用于document_attributes

    【讨论】:

    • 谢谢,我已经这样做并尝试创建一个新联系人,但 document_id 仍然为零
    • 我看不出有什么问题。也许这就是定义关联的方式。查看您的模型,您可能希望一个联系人拥有许多文档并且一个文档属于一个联系人。你目前有相反的方式。通过您的设置,您尝试使用子对象(联系人)创建父对象(文档)。这并非闻所未闻,但通常情况正好相反。 api api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/… 中的示例也没有显示它被用于belongs_to 关联。看看吧。
    【解决方案2】:

    您的迁移有问题:

    add_attachment :documents, :add_attachment
    

    这意味着您的数据库表的附件列将改为 add_attachment,从而导致 Paperclip 无法工作

    您需要通过如下迁移来更改数据库中的列:

    class Migration < ActiveRecord::Migration
      def change
        rename_column :documents, :add_attachment_file_name, :attachment_file_name
        rename_column :documents, :add_attachment_content_type, :attachment_content_type
        rename_column :documents, :add_attachment_file_size, :attachment_file_size
        rename_column :documents, :add_attachment_updated_at, :attachment_updated_at
      end
    end
    

    【讨论】:

    • 好的,需要更多反馈 - 您遇到了什么错误?流程是什么样的?您的日志中将出现unpermitted params 错误或其他问题。我们需要更多信息
    • 谢谢 - 我从创建新联系人时复制了 heroku 日志
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2014-04-29
    • 2015-09-08
    相关资源
    最近更新 更多