使用Grape和ActiveRecord的ForbiddenAttributesError

时间:2014-11-25 17:36:13

标签: ruby-on-rails ruby grape-api

我有一个使用Grape的ruby应用程序,它没有轨道。

class Article < ActiveRecord::Base
end

class API::Articles < Grape::API
  post '/articles' do
    article = Article.create(params[:article])
  end
end

Article.create提供ActiveModel::ForbiddenAttributesError:

有一些关于它的讨论 here,但我不知道 明白它。我试过这个建议:

post '/articles' do
  article = Article.create(permitted_params[:article])
  represent(article, env)
end

helpers do
  def permitted_params
    @permitted_params ||= declared(params, include_missing: false)
  end
end

此时@permitted_params为空,因此属性消失。

我还尝试用ActionController::Parameters包装哈希值,但这会因其他错误而失败。

目前在Grape中解决ForbiddenAttributesError的建议解决方案是什么?

Grape为params使用hashie gem,而their solution为此包含一个名为hashie_rails的gem,但是这个gem带来了所有的rails,但我不想要任何那。所以我需要一个香草解决方案。

2 个答案:

答案 0 :(得分:0)

https://gist.github.com/smd686s/6320643

Gemfile

gem "actionpack", "~> 4.0.0"

app.rb

require 'rack/test'
require 'action_controller/metal/strong_parameters'

#https://github.com/rails/rails/blob/master/actionpack/test/controller/parameters/parameters_require_test.rb

module Application
  class API < Grape::API

    helpers do
      def item_params
        ActionController::Parameters.new(params).require(:item).permit(:attribute)
      end
    end

    desc "Create an item."
    post :items do
      Item.new item_params
    end
  end
end

答案 1 :(得分:0)

您需要使用hashie-forbidden_attributes中提到的grape documentation gem:

  

此外,如果您的Rails版本是4.0+并且应用程序使用ActiveRecord的默认模型层,您将需要使用hashie-forbidden_​​attributes gem。此gem在模型层禁用了strong_params的安全功能,允许您使用Grape自己的参数验证。