如何在没有Rails的情况下实现强参数保护



我正在开发一个模板web应用程序与歌利亚+葡萄+活动记录4.2 +活动记录迁移。这是我的迁移文件

# db/migrate/20150519063210_create_albums.rb
class CreateAlbums < ActiveRecord::Migration
  def change
    create_table :albums do |t|
      t.string :name
      t.string :artist
      t.string :genre
      t.date :published_at
    end
  end
end

和我的模型

# app/models/Album
class Album < ActiveRecord::Base
end

和Grape API

class ApiV1 < Grape::API
  version 'v1', using: :path
  format :json
  resource 'albums' do
    get '/' do
      Album.all
    end
    post '/' do
      Album.create(params[:album])  # <-- raises ActiveModel::ForbiddenAttributesError
    end
  end
end

当我用一些参数调用POST /v1/albums/时,应用程序总是引发ActiveModel::ForbiddenAttributesError。似乎ActiveRecord想要ActionController::Parameters作为参数,但葡萄给了它Hashie::Mash

我已经尝试实现一个简单的机架中间件,将env['params']Hash转换为ActionController::Parameters,并在Goliath::Rack::Params之后使用它,但是当调用助手方法params时,Grape只是将其消毒。我还尝试实现和使用一个Grape中间件来做同样的事情,并得到了相同的结果。

是否有任何解决方案,或者我只需要降级到ActiveRecord 3?

您可以使用您的参数创建一个帮助器来生成ActionController::Parameters的实例:

require 'action_controller/metal/strong_parameters' 
class ApiV1 < Grape::API
  version 'v1', using: :path
  format :json
  helpers do
    def albums_params
      ActionController::Parameters.new(params).require(:album).permit(:attr1, :attr2)
    end
  end
  resource 'albums' do
    get '/' do
      Album.all
    end
    post '/' do
      Album.create(albums_params)
    end
  end
end
也可以使用hashie-forbidden_attributes gem。

相关内容

  • 没有找到相关文章