2014-11-25 2 views
2

У меня есть рубиновое приложение с использованием Grape, и у него нет рельсов.ForbiddenAttributesError с Grape и ActiveRecord

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, но это не удается с другими ошибками.

Что предлагается для решения проблемы ForbiddenAttributesError, в Винограде?

Виноград использует драгоценный камень хэши для params и their solution, чтобы включить драгоценный камень, называемый hashie_rails, но этот камень приносит все рельсы с ним, но я не хочу этого. Поэтому мне нужно решение ванили.

+0

Если вы не хотите использовать драгоценный камень Hashie, просто преобразуйте ваши @permitted_params в хэш: '@permitted_params || = объявил (params, include_missing: false) .to_hash' –

ответ

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 
0

Вы должны использовать hashie-forbidden_attributes камень, как указано в grape documentation:

Кроме того, если версия Rails равна 4.0+, а приложение использует стандартный слой ActiveRecord, вы захотите использовать драгоценный камень hashie-forbidden_attributes. Этот драгоценный камень отключает функцию безопасности сильных_парамов на уровне модели, позволяя вместо этого использовать собственную проверку параметров Grape.