2015-10-20 76 views
1

我有幾個類的方法可以幫助查詢數據庫,但我想爲發送到這些方法的參數添加某種驗證。例如,Rails類方法驗證

def self.get_ayahs_by_range(surah_id, from, to) 
     self.where('quran.ayah.surah_id = ?', surah_id) 
      .where('quran.ayah.ayah_num >= ?', from) 
      .where('quran.ayah.ayah_num <= ?', to) 
      .order('quran.ayah.surah_id, quran.ayah.ayah_num') 
    end 

其從控制器通過使params[:surah_id]params[:to]params[:from]該函數調用。

有時,由於某種原因,我們有:surah_idundefined這導致一團糟。我如何通過驗證來修復?

除了strong_params之外的任何對params驗證的建議對索引操作不起作用我覺得呢?

控制器:

def index 
    unless valid_params? 
     return render json: {message: 'Params are wrong.'} 
    end 

    params_hash = (params[:range] || ("#{params[:from]}-#{params[:to]}")) + "/#{params[:quran]}/#{params[:audio]}/#{params[:content]}" 

    if params.key?(:range) 
     range = params[:range].split('-') 
    elsif params.key?(:from) && params.key?(:to) 
     range = [params[:from], params[:to]] 
    else 
     range = ['1', '10'] 
    end 

    if (range.last.to_i - range.first.to_i) > 50 
     return render json: {error: "Range invalid, use a string (maximum 50 ayat per request), e.g. '1-3'"} 
    end 

    @results = Rails.cache.fetch("surahs/#{params[:surah_id]}/ayahs/#{params_hash}", expires_in: 12.hours) do 
     ayahs = Quran::Ayah.get_ayahs_by_range(params[:surah_id], range[0], range[1]) 
     Quran::Ayah.merge_resource_with_ayahs(params, ayahs) 
    end 

    render json: @results 
    end 
+0

如何在控制器中獲取參數可以發佈它們。可能是有強烈的參數解決方案 –

+0

只是一個API調用我的控制器? –

回答

1

讓你的模型創建一個新的簡單類(它沒有在你的數據庫中的表)

require 'ostruct' 
class SearchOptions < OpenStruct 
    include ActiveModel::Validations 
    validates :surah_id, presence: true 
    validates :from, presence: true 
    ... 
end 

然後在控制器

@search_option = SearchOption.new(seach_params) 
@search_option.valid? 
    # here you put the "invalid" processing 
    # maybe re-render the search parameters view 
end 
+0

以某種方式,它就像一個建設者......這是一個肯定的選擇。我不知道我有多愛它,但絕對是一種選擇! –