2013-05-23 6 views
3

Как избежать дублирования кода?Как написать одинаковые требования для нескольких маршрутов, например. ПОСТ, ПУТЬ? (Ruby Grape)

resource 'api/publication/:publicationName' do 

    params do 
    requires :type, type: String, regexp: /^(static|dynamic)$/i 
    requires :name, type: String, regexp: /^[a-z0-9_\s]+$/i 
    requires :liveStartDate, type: String, regexp: dateRegexp 
    optional :liveEndDate, type: String, regexp: dateRegexp 
    requires :query, type: String 
    end 
    post '/dynamic' do 
    authenticate! 
    save_or_update(params) 
    end 

    params do 
    requires :type, type: String, regexp: /^(static|dynamic)$/i 
    requires :name, type: String, regexp: /^[a-z0-9_\s]+$/i 
    requires :liveStartDate, type: String, regexp: dateRegexp 
    optional :liveEndDate, type: String, regexp: dateRegexp 
    requires :query, type: String 
    end 
    put '/dynamic/:id' do 
    authenticate! 
    save_or_update(params) 
    end 

end 

ответ

6

В более поздних версиях винограда, вы можете создать многоразовый именованные группы параметров. Например:

resource 'api/publication/:publicationName' do 
    helpers do 
    params :common do 
     requires :type,   type: String, regexp: /^(static|dynamic)$/i 
     requires :name,   type: String, regexp: /^[a-z0-9_\s]+$/i 
     requires :liveStartDate, type: String, regexp: dateRegexp 
     optional :liveEndDate, type: String, regexp: dateRegexp 
     requires :query,   type: String 
    end 
    end 

    params do 
    use :common 
    end 
    post '/dynamic' do 
    authenticate! 
    save_or_update(params) 
    end 

    params do 
    use :common 
    end 
    put '/dynamic/:id' do 
    authenticate! 
    save_or_update(params) 
    end 
end 

Одно из преимуществ делать вещи таким образом, что вы можете смешивать различные группы параметров, включив множественные use заявления для различных именованных Params.

+0

Я получаю сообщение об ошибке '' 'ArgumentError - неправильное количество аргументов (1 для 0):' '' Я использую виноград 0.10.1. Какую версию вы используете? Вы должны сделать это так. '' 'класса API <Виноградный :: API хелперы сделать Params: разбивка этого дополнительно: страница, Тип: Integer опционально: per_page, тип: Integer конец конец убывание "Получить коллекцию" PARAMS сделать использование: # разбиения на страницы псевдонимами: включает в себя, use_scope конец получают сделать Collection.page. (Params [: страницы]) в (PARAMS [: per_page]) конец end''' –

+0

@ChunYang, вы правы. Я скорректировал образец кода так, чтобы именованные параметры были вложены в блок помощников. Больше информации здесь: https://github.com/ruby-grape/grape#helpers –

3

Попробуйте это:

resource 'api/publication/:publicationName' do 
    common_params = Proc.new do 
    requires :type,   type: String, regexp: /^(static|dynamic)$/i 
    requires :name,   type: String, regexp: /^[a-z0-9_\s]+$/i 
    requires :liveStartDate, type: String, regexp: dateRegexp 
    optional :liveEndDate, type: String, regexp: dateRegexp 
    requires :query,   type: String 
    end 

    params(&common_params) 
    post '/dynamic' do 
    authenticate! 
    save_or_update(params) 
    end 

    params(&common_params) 
    put '/dynamic/:id' do 
    authenticate! 
    save_or_update(params) 
    end 
end 
+0

проверено и работает так же, как прежде! – hfossli

 Смежные вопросы

  • Нет связанных вопросов^_^