4

私はかなり落ち着いたAPIを持っていますが、検索をきれいに実装する方法を見つけるのに苦労しています。2つの日時の間のすべてのレコードを検索できるようにしたいのですが、日時は最大6時間離すことができます。現在、私のコントローラーメソッドには次のものがあります。

required_params = [:start_time, :end_time]
if check_required_params(required_params, params) and check_max_time_bound(params, 6.hours)
   ... rest of controller code here ...
end

check_required_pa​​ramsは、次のようなアプリケーションメソッドです。

def check_required_params(required_params, params_sent)
required_params.each do |param|
  unless has_param(param, params_sent)
    unprocessable_entity
    return false
  end
end
  true
end

check_max_timeはかなり似ています。

コントローラで検証を行うことはベストプラクティスに反することは知っていますが、それをモデルにきれいに追加する方法がわかりません。

4

3 に答える 3

5

実際にあなたがしていることは(ほとんど)best practiceそして(ほとんど)Rails4に。で組み込まれるでしょうstrong parametsers。(ほとんどcheck_max_timeの場合、モデルでの検証である必要があるように見えるためです。)

あなたは先に進んで、今日機能を取り入れて、あなた自身でアップグレードをより簡単にするべきです。強力なパラメーター https://github.com/rails/strong_parameters

ドキュメントはありますが、これを組み込む方法は次のとおりです。

class SearchController < ApplicationController
  include ActiveModel::ForbiddenAttributesProtection

  def create
    # Doesn't have to be an ActiveRecord model
    @results = Search.create(search_params)
    respond_with @results
  end

  private

  def search_params
    # This will ensure that you have :start_time and :end_time, but will allow :foo and :bar
    params.require(:start_time, :end_time).permit(:foo, :bar #, whatever else)
  end
end

class Search < ActiveRecord::Base
  validates :time_less_than_six_hours

  private

  def time_less_than_six_hours
    errors.add(:end_time, "should be less than 6 hours from start") if (end_time - start_time) > 6.hours
  end
end
于 2012-12-11T04:05:13.983 に答える
1

これに対する明確な答えは見つかりませんでした。ただし、APIを作成している場合、Grapeにはそれを処理するためのParameterValidationとCoercionが組み込まれています。

于 2012-12-10T22:16:46.470 に答える
0

このシナリオで私が行うことは、これら2つの日時の間にデフォルト値を設定して、検証を行って例外を発生させる必要がないようにすることです。

class SearchController < ApplicationController
  before_filter :assign_default_params

  def index
  end

  private
  def assign_default_params
    params[:start_time] ||= Time.now
    params[:end_time]   ||= params[:start_time] + 6.hours
    params[:end_time]     = params[:start_time] + 6.hours if ((params[:end_time] - params[:start_time]) / 3600).round) > 6
  end
end

上記のこのコードでは、検索に必要なパラメータが常に含まれています。assign_default_paramsクライアントから送信されない場合、メソッドはデフォルト値を割り当てようとします。params[:end_time]最後に、最大値を割り当てます。

検証を行う必要がなく、クライアントがなどの別の応答コードを処理する必要がないため、非常に便利です422。また、この事実についても記載したAPIドキュメントが必要です。

于 2012-05-28T05:01:52.927 に答える