8

Ich habe eine ActiveRecord-Klasse namens Benutzer. Ich versuche, eine Sorge Restrictable die in einigen Argumenten wie dies geschieht genannt zu erstellen:So erstellen Sie eine Rails 4 Problem, das ein Argument

class User < ActiveRecord::Base 
    include Restrictable # Would be nice to not need this line 
    restrictable except: [:id, :name, :email] 
end 

Ich möchte eine Instanz Methode restricted_data aufgerufen dann bereitzustellen, die eine Operation auf diesen Argumenten durchführen können und einige Daten zurückgeben. Beispiel:

user = User.find(1) 
user.restricted_data # Returns all columns except :id, :name, :email 

Wie würde ich das machen?

Antwort

13

Wenn ich Ihre Frage richtig verstanden ist dies darüber, wie eine solche Sorge zu schreiben, und nicht über den tatsächlichen Rückgabewert von restricted_data. Ich würde die Sorge Skelett als solche umzusetzen:

require "active_support/concern" 

module Restrictable 
    extend ActiveSupport::Concern 

    module ClassMethods 
    attr_reader :restricted 

    private 

    def restrictable(except: []) # Alternatively `options = {}` 
     @restricted = except  # Alternatively `options[:except] || []` 
    end 
    end 

    def restricted_data 
    "This is forbidden: #{self.class.restricted}" 
    end 
end 

Dann können Sie:

class C 
    include Restrictable 
    restrictable except: [:this, :that, :the_other] 
end 

c = C.new 
c.restricted_data #=> "This is forbidden: [:this, :that, :the_other]" 

, die mit der Schnittstelle entsprechen würden Sie entworfen, aber der except Schlüssel ist ein wenig seltsam, weil es tatsächlich ist, diese Werte zu beschränken anstatt ihnen zu erlauben.

Verwandte Themen