2016-02-22 53 views
0

我有一個Rails站點上的紅寶石表單,它帶有一堆不同的參數。我想確保這些參數都不相等,如果它們不是空白的話。如何設計表格,這些值都不是必需的,因此其中一些值可以是空白的。我當然可以用條件聲明來做到這一點,但我想確保是否有更清晰的方法來做到這一點,因爲條件聲明對於所有這些檢查都是巨大的。同樣,如果任何一個值在選擇這些值時(並且只在這些值被選擇時)彼此相等,我想返回一個不能相等的錯誤。這些值由collection_select控件選擇,所以我沒有看到任何預先過濾掉重複項的方法。有沒有比較所有這些值的更簡潔的方法?Ruby on Rails檢查多個值不是空白或彼此相等

if ((value1 == value2) && !value2.blank?) || 
    ((value1 == value3) && !value3.blank?) || 
    ((value1 == value4) && !value4.blank?) || 
    .... 
    ((value9 == value10) && !value10.blank?)) 
    Do error stuff 
else 
    Behave normally 
end 

回答

0

這是我能想到的最乾淨的方式,假設你不需要知道哪些元素是相等的:

  1. 我承擔的項目是一個數組(或一個可以輕鬆變成數組的集合)。無論如何,以某種方式將它們以這種形式出現。

    ary = [value1,value2,value3,value4,value5,value6,value7,value8,value9,value10] 
    
  2. 刪除空白項目。

    ary.reject!(|value| value.blank?) 
    
  3. 找出是否有比獨特元素

    多個元素
    if ary.length > ary.uniq.length 
        # Do error stuff 
    else 
        # Behave Normally 
    end 
    

注:

這種做法可能是乾淨的閱讀和高度可擴展的(一使用這種方法的100個元素陣列比100個elsifs效率更高)。但是,如果您的數據不是以易於數組就緒的形式存在(即已經存在於數組,哈希或其他枚舉中),那麼賦值到數組中可能不值得。

此外,如前面提到的,這僅返回如果值是共享的,不哪些值是共享的,或哪些變量份額值。

此外,對於第2步,如果您正在檢查的唯一值是nil,則可以簡單地使用ary.compact!代替。

0

首先,錯誤和表單/數據驗證應該是模型層的東西。所以你應該考慮把它移到模型的驗證上,然後ActiveRecord錯誤+類似simple_form的東西會使錯誤升級/渲染變得輕而易舉。

回到你的問題 - 你使用的是Rails 4嗎?如果是這樣,像康納提到,只需添加一點邏輯在permit!

class ExampleController < ApplicationController 

    private 
    def permitted_params 
    params.require(:example).permit(:a, :b, :c).reject!(&:blank?) 
    end 
end 

然後,你的邏輯變得簡單去掉空白PARAMS值,你可以直接比較值......這在這一點上我想補充到你的模型層

class MyModel < ActiveRecord::Base 

    validate: :must_be_different 

    private 
    def must_be_different 
    # compare value1 with value2 (take advantage of _changed? helper) 
    end 
end 
相關問題