2016-09-19 29 views
0
def index 
    @users = User.all.paginate(page: params[:page]) 
    @users = User.named(params[:name]).paginate(page: params[:page]) if params[:name].present? 
    @users = User.countryname(params[:country]).paginate(page: params[:page]) if params[:country].present? 
    @users = User.gender(params[:gender_type]).paginate(page: params[:page]) if params[:gender_type].present? 
end 

控制器變量中下面的代碼工作正常,如果只:name:country:gender_typepresent。但如果存在多個參數,則它不起作用。爲多個參數編寫代碼的DRY方式是什麼?顯然,我不想爲每個可能的參數組合創建不同的代碼行。如何創建爲單個或多個PARAMS

這裏是範圍:

class User 
scope :countryname, -> (country) { where("country ILIKE ?", "%#{country}%")} 
scope :gender, -> (gender_type) { where gender_type: gender_type} 
scope :named, -> (name) { where("name ILIKE ?", "%#{name}%")} 

如果我有

example.com/users?name=sam & gender_type的查詢字符串=男性

它只是返回名稱爲sam的所有用戶並忽略其性別...我需要編碼:

@users = User.gender(params[:gender_type]).named(params[:name]).paginate(page: params[:page]) if params[:gender_type] && params[:name].present? 

但我不想爲每個參數組合編寫一行新的代碼。

+1

嗯,也許共享您的範圍方法的語法? '''','country'','gender' –

+0

你可以遍歷params散列,但是由於你的範圍的命名約定,你將無法使用每個參數的鍵作爲對該方法的調用而沒有聲明它明確地首先。 – bkunzi01

+0

@ bkunzi01我不明白「沒有明確說明」。請參閱編輯的問題。 –

回答

0

的問題是代碼應該然後

@users = User.all.paginate(page: params[:page]) 
@users = @users.named(params[:name]).paginate(page: params[:page]) if params[:name].present? 
etc 

Rails會自動允許鏈作用域。前面的代碼創建獨立的獨立非鏈式實例變量。

2

您可以使用ruby try方法。例如,你可以寫如

@users = User.try(:gender, params[:gender_type]).try(:paginate, page: params[:page]) 

查看try in api docs其他使用方法。