Uzależenienie zmiennej od środowiska... Jak?

Cześć,

# config/initializers/paperclip.rb
Paperclip.options[:image_magick_path] = '/opt/local/bin'

Jak to uzależnić od środowiska? Na serwerze produkcyjnym, imagemagick jest w innym miejscu…

ifem lub hashem konfiguracyjnym (klucze == nazwa środowiska) lub tablica możliwych ścieżek i ich przeszukanie lub…

ja mam tak:

Paperclip.options[:image_magick_path] = “/usr/local/bin” if Rails.env == “production”

wywolaj komende systemowa
np:

$whereis convert

odpowiedz bedzie mniej wiecej taka
convert: /usr/bin/convert /usr/share/man/man1/convert.1.bz2

wybierasz z tego 2 czesc, jakis regexp i masz zawsze poprawne

to tylko przyklad oczywsci ale idea chyba ok?

A czy w takim przypadku:

class Jewel < ActiveRecord::Base
  has_attached_file :image, :styles => { :small => "150x150>", :medium => "400x400" },
                    :url  => "http://static.foobars.com/jewels/:id/:style/:basename.:extension",
                    :path => "/home/zmali/www/imgs/jewels/:id/:style/:basename.:extension"

:url i :path powinny być ustawiane tu w klasie modelu z ifem (w zależności od środowiska), czy w plikach environments/*.rb jako jakaś stała (pole Paperclipa?)?
Wiadomo, że różni się dla produkcji i serwera deweloperskiego…

[quote=zmaliszewska] class Jewel < ActiveRecord::Base has_attached_file :image, :styles => { :small => "150x150>", :medium => "400x400" }, :url => "http://static.foobars.com/jewels/:id/:style/:basename.:extension", :path => "/home/zmali/www/imgs/jewels/:id/:style/:basename.:extension"
:url i :path powinny być ustawiane tu w klasie modelu z ifem (w zależności od środowiska), czy w plikach environments/*.rb jako jakaś stała (pole Paperclipa?)?
Wiadomo, że różni się dla produkcji i serwera deweloperskiego…[/quote]
Użyj App (http://github.com/bragi/app/). W pliku config/app.yml zdefiniuj odpowiednie wpisy:

development: paperclip_path: "/home/zmali/www/imgs/jewels/:id/:style/:basename.:extension" production: paperclip_path: "/var/www/rails/app/imgs/jewels/:id/:style/:basename.:extension"
i użyj ich w aplikacji:

class Jewel < ActiveRecord::Base
  has_attached_file :image, :styles => { :small => "150x150>", :medium => "400x400" },
                    :url  => "http://static.foobars.com/jewels/:id/:style/:basename.:extension",
                    :path => App.paperclip_path

Zacznij używać google, skuteczne rozwiązania znajdziesz również na http://ruby-toolbox.com/.

Staraj się też nie używać zwrotu Wiadomo, że…, co w slangu akademickim oznacza dla mnie jest to oczywiste, więc dla innych z pewnością też (i nie chce mi się sprawdzić czy się nie mylę).

Dzięki, to rozwiązuje problem. Czy nie da się definiować tego jednak w plikach environment/*.rb ? Wydaje mi się to bardziej naturalne.

Może postawię pytanie trochę inaczej: jak z poziomu modelu dostać się do:

config.action_controller.perform_caching = true

które jest zdefiniowane w pliku config/environments/development.rb, czy jest w ogóle taka możliwość?

Co do Google - to używam :slight_smile:

Wiadomo, że… w slangu akademickim to dla mnie raczej podobno tak jest, nie wiem do końca, i nie było czasu sprawdzić…. Jednak to już off-topic. A tutaj obracamy się w kręgu porządnych programistów, przynajmniej ja kieruję swoje posty do takich :slight_smile: więc zdaje mi się, że pewne założenia mogę poczynić - tym bardziej, że akurat mam pewność do tego co piszę. Dodatkowo w moim zdaniu zabrakło podmiotu Wiadomo, że ten url różni się dla produkcji i serwera deweloperskiego… - i może to zmieniło za bardzo sens zdania. Jeszcze się nad tym zastanowię - dzięki, że napisałeś co Ty o tym myślisz.

To jest złe rozwiązanie, bo zakłada, że na komputerze developerskim nie uruchomisz środowiska production. A robi się to często podczas testowania cache na przykład.

environment/*.rb służą do określenia środowisk, trzyma się je w repozytorium.

Plik app.yml każdy ma swój, osobny jest też dla serwerów produkcyjnych. W repozytorium trzyma się tylko przykładowy plik app.yml.example, który generator app umie wykorzystać.

Nie napiszę, że się nie zgadzam, bo nie do końca rozumiem co masz na myśli, ale zdefiniowanie stałych:

PAPERCLIP_BASE_PATH = "http://static.foobars.com/"
PAPERCLIP_BASE_URL = "/home/httpd/apps/"

różnych dla plików production.rb i development.rb powoduje, że w modelu mogę zdefiniować:

class Jewel < ActiveRecord::Base
  has_attached_file :image, :styles => { :small => "150x150>", :medium => "400x400" },
    :url => "#{PAPERCLIP_BASE_URL}jewels/:id/:style/:basename.:extension",
    :path => "#{PAPERCLIP_BASE_PATH}/imgs/jewels/:id/:style/:basename.:extension" 

co działa tak jak chcę i wydaje mi się dobrym podejściem.

Jeżeli zmienię sobie ENV na serwerze deweloperskim na “production” to zmienne te zostaną odczytane z config/environments/production.rb…

Czy takie podejście jest złe???

Jest o tyle nie-cool, że inny deweloper z twojego zespołu może nie mieć (raczej nie będzie miał) katalogu

#PAPERCLIP_BASE_URL = "/home/httpd/apps/"

A to właśnie wciśniesz mu w gardło wpisując tę linijkę do ŚRODOWISKO.rb, który jest trzymany w repozytorium i tym samym wspólny dla wszystkich. I to właśnie chodziło Bragiemu.

Tak samo jak nie trzymasz w repo database.yml, tak samo ów application.yml sobie dodasz do svn/git ignore’a i będzie grało :slight_smile:

Dobra, rozumiem :slight_smile: ale idąc tym tropem, czemu nie mogę stworzyć environments/development.rb.example i dać ignore’a na environments/development.rb??

Może to wynika z konwencji? Dobrych praktyk? Nie wiem o tym…

Swoją drogą database.yml trzymam w repo… Ale już nie będę. Jeszcze jakieś pliki poiwnny być ignorowane?

Konwencja jest taka, że plików z kodem – czyli .rb własnie – generalnie się nie ignoruje tylko grzecznie je trzyma w repo.
Natomiast pliki czysto konfiguracyjne – w świecie railsów głównie .yml – jak najbardziej się dodaje do ignore jeśli jest szansa/ryzyko, że konfiguracja może być inna na innej maszynie.