2015-12-22 3 views
0

У меня есть несколько функций, в моей моделиГлобальных динамический путь переменной

#app/model/game.rb  
... 

def uncompress_game_files_to_s3 
    UncompressToS3Job.perform_now(self.files, "assets/#{self.id}/game") if self.files 
end 

def delete_game_files_from_s3 
    DeleteFromS3Job.perform_now("assets/#{self.id}/game") 
end 

def update_game_index_file_url 
    files = FindFilesOnS3Job.perform_now("index.html", "assets/#{self.id}/game") 
    self.update_attributes(url: files.first) 
end 

Во всех этих функциях, я использую "assets/#{self.id}/game" для атрибута ключа S3. Я хотел бы использовать это выражение как глобальную переменную aws_game_path.

Я попытался инициализировать его в файле инициализации.

#config/initializers/aws.rb 
aws_game_path = "assets/#{self.id}/game" 

, но так как он выходит из модельного объема, то возникает ошибка undefined method `id'. Как объявить такую ​​переменную?

+0

Это не глобальная переменная, это локальная переменная. – sawa

ответ

0

Я думаю ActiveSupport::Concern бы лучше практика в этом случае.

Следуйте ниже шаг, чтобы сделать доступными для всех модели

1: Создать rb позволяет говорить active_record_global_var.rb расширение файла в lib как lib загрузить файл первым.

2: вставьте следующий фрагмент кода.

module ActiveRecordExtension 

    extend ActiveSupport::Concern 

    def set_global_valiable 
    set_global_id = self 
    end 

    module ClassMethods 

    end 

end 

ActiveRecord::Base.send(:include, ActiveRecordExtension) 

3: Создайте файл в config/initializers/ каталог. Скажем, extensions.rb и поместите этот код в этот файл.

4:require "active_record_global_var"

5: теперь называть set_global_variable метод экземпляров на модели объекта. Этот метод будет доступен для все модели.

Например:

User.last.set_global_valiable.idдает идентификатор для пользователя

CbResume.last.set_global_valiable.idже, как и для CbResume модели

надеюсь, что это поможет вам !!!

+0

Thabk вам это полезно! – user3301847

0

Если вы используете его только с этой модели, он не должен быть глобальным. Может быть просто частный метод:

def update_game_index_file_url 
    files = FindFilesOnS3Job.perform_now("index.html", game_path) 
    self.update_attributes(url: files.first) 
end 

private 

def game_path 
    "assets/#{id}/game" 
end 

Как я могу объявить такое Название переменной.

Переменные не ведут себя так. Это должен быть метод для некоторого объекта. Общий, если вы хотите использовать эту логику вне модели. Что-то вроде этого, возможно:

module PathHelpers 
    def self.game_path(game) 
    "assets/#{game.id}/game" 
    end 
end 

class Game 
    def update_game_index_file_url 
    files = FindFilesOnS3Job.perform_now("index.html", PathHelpers.game_path(self)) 
    end 
end 
+0

Спасибо за ответ. Это полезно, но если я хочу использовать его и в другой модели, где я могу его объявить? – user3301847

Смежные вопросы