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

时间:2015-05-19 09:22:47

标签: ruby activerecord strong-parameters grape-api goliath

我正在使用 Goliath + Grape + Active Record 4.2 + Active Record Migrations 开发样板Web应用程序。这是我的迁移文件

# 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成为参数,但Grape给它Hashie::Mash

我尝试过实施一个简单的Rack中间件,将env['params']Hash转换为ActionController::Parameters并在Goliath::Rack::Params之后使用它,但Grape只是在调用辅助方法params。我也尝试使用Grape中间件来做同样的事情并得到相同的结果。

有没有解决方案,或者我只需要降级到ActiveRecord 3?

1 个答案:

答案 0 :(得分:0)

您可以使用参数创建一个帮助器来生成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。