Walidacja parametrów dla kontrolera

Hej,
robię sobie api do którego przychodzą jakieś parametry. I zastanawiam się jak i w którym momencie sprawdzać czy są obecne i poprawne. Chciałbym by kontroler był jak najchudszy.

Na przykład jeśli którychś z parametrów jest zły:

def index
Post.from(params[:date_from]).to(params[:date_to]).for_user(params[:user_id])
rescue ArgumentError => e
render json: e.to_json, status: :bad_request
end

Tylko gdzie rzucać ArgumentError? W jakimś before filter w kontrolerze którzy waliduje parametry dla akcji? Czy może w scopach?
Czy może stworzyć coś na kształt ApiPost#from_to_by_user które będzie się zajmowało zwracaniem odpowiedzi i jednocześnie walidacją parametrów?

Może jakieś mądre artykuły, prezentacje?

https://github.com/rails/strong_parameters zrobi robote

@Paweł

Mi bardziej chodzi o parametry dla metod wywoływanych by api uzyskało odpowiednie dane. A z tego co widzę to strong parameters raczej odnosi się do mass assighment. A ja potrzebuję innych parametrów dla każdej akcji (każda wyciąga coś innego).

A jako offtop to kiedyś zrobiłem coś podobnego do strong parameters… https://github.com/slawosz/rails-param-protection ale z różnych przyczyn projekt umarł…

[quote=slawosz]@Paweł

Mi bardziej chodzi o parametry dla metod wywoływanych by api uzyskało odpowiednie dane. A z tego co widzę to strong parameters raczej odnosi się do mass assighment. A ja potrzebuję innych parametrów dla każdej akcji (każda wyciąga coś innego).[/quote]
Chodziło mi mniejwięcej o coś takiego

[code]def index
Post.from(post_params[:date_from]).to(post_params[:date_to]).for_user(post_params[:user_id])
end

private
def post_params
@post_params ||= params.require(:date_from, :date_to, :user_id)
end[/code]
Ale teraz widzę że require pozwala tylko na określenie 1 parametru wymaganego i faktycznie w obecnej formie nie nadaje się do niczego innego jakt tylko do ladania mass assignment

W zasadzie to przekombinowałem strasznie, tak jest przecież prościej:

def index Post.from(params.require(:date_from)).to(params.require(:date_to)).for_user(params.require(:user_id)) end

No, ale to już jest jakiś trop, aby zrobić metodę required_parameters ktora rzuca wyjątkiem gdy nie ma szukanego parametru.

https://github.com/intridea/grape ?

możesz metodę post_params napisać tak:

[code=ruby]private
def post_params
@post_params ||= begin
params.require(:date_from)
params.require(:data_to)
params.require(:user_id)

params

end
end[/code]