【问题标题】:Paperclip with Devise回形针与设计
【发布时间】:2016-05-25 16:16:34
【问题描述】:

我有一个带有 AngularJS 前端应用的应用,它向我的 Rails 后端应用发送 JSON 请求。我正在使用 Paperclip 和 Devise,User 模型的规格已更改,以便允许上传图像。

由于我已经有一个 image 属性,为了存储 Omniauth 登录返回的 url,我为我的 User 模型创建了一个新属性,使用以下命令:

rails g paperclip user stored_image

并运行后续迁移。

我的user.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, #:confirmable,
     :recoverable, :rememberable, :trackable, :validatable,
     :omniauthable, :omniauth_providers => [:facebook]

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

我用来覆盖一些设计限制的注册控制器如下

class RegistrationsController < Devise::RegistrationsController
  protected

  def update_resource(resource, params)
    # debugger
    resource.update_without_password(params)
  end
end

我的application_controller.rb

class ApplicationController < ActionController::Base
  respond_to :html, :json
  before_filter :configure_permitted_parameters, if: :devise_controller?
  after_filter :set_csrf_cookie_for_ng
  protect_from_forgery  #with: :null_session
  before_action :set_locale

  def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
  end

  def handle_unverified_request
    forgery_protection_strategy.new(self).handle_unverified_request
  end

  def set_csrf_cookie_for_ng
    cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
  end

  protected

  def verified_request?
    super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN'])
  end

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:current_password ,:first_name, :last_name, :email, :password, :password_confirmation, :sex, :phone_number, :location, :birthday, :stored_image)}
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:first_name, :last_name, :email, :sex, :phone_number, :location, :birthday, :stored_image ) }
    end
  end

需要澄清的是,用户只在更新操作中上传他的图片。因此,当我在update_resource 操作中调试并检查params 时,我发现stored_image 不存在,因此无法存储图像。我的application_controller.rb 是否正确,可以让设备接受图片上传?

【问题讨论】:

  • 那么这里有什么问题?
  • 发生了一些奇怪的事情,在完成之前提交了问题并且没有意识到
  • 您是否允许 stored_image 在您的强参数中?
  • 啊,我忘了把我的application_controller.rb 放在问题中,你在哪里配置了强大的参数,对吗?

标签: ruby-on-rails devise paperclip


【解决方案1】:

查看THIS 文章,了解如何将自定义字段添加到 Devise。

这是因为 Rails 4 处理“批量分配”的方式。出于安全原因,我们必须明确允许每个控制器内部的参数。

在您的 app/controllers/application_controller.rb 中明确允许您的参数 - 在您的情况下为 stored_image:

class ApplicationController < ActionController::Base
    # Prevent CSRF attacks by raising an exception.
    # For APIs, you may want to use :null_session instead.
    protect_from_forgery with: :exception

    before_filter :configure_permitted_parameters, if: :devise_controller?

    protected

        def configure_permitted_parameters
            devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:name, :email, :password) }
            devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:name, :email, :password, :stored_image) }
        end
end

【讨论】:

  • 我已经在强参数中明确添加stored_image,检查更新的问题,这已经包含在我的application_controller.rb
【解决方案2】:

我的问题与强参数无关。出于某种原因,我不得不先将请求解析为 JSON,然后更新属性,在本例中为 stored_image 属性

【讨论】:

    猜你喜欢
    • 2018-10-01
    • 2011-03-27
    • 2011-08-09
    • 2014-01-31
    • 2011-12-27
    • 2013-08-02
    • 2014-01-12
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多