2015-10-20 72 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

以某种方式,它就像一个建设者......这是一个肯定的选择。我不知道我有多爱它,但绝对是一种选择! –