Wyswietlic nazwy plikow wykorzystanych do generacji widoku

Witam,

W jaki sposob moge wyswietlic na stronie spis plikow wykorzystanych do wyrenderowania widoku ?

Chodzi o to ze osoba zajmujaca sie cieciem strony / css, grafika itp musi dosyc czesto “grzebnac” w plikach layoutu, widoku lub partiala, ze wzgledu na rozne aliasy w config/routes nie zawsze po url’u w pasku przegladarki jest oczywiste ktory aktualnie layout jest wyswietlany, lub ktory widok jest wykorzystany.

Czy jest jakas mozliwosc pobrania tych informacji bezposrednio z aplikacji Rails w locie, tak aby je wsztrzyknac w partiala i wyswietlic na stronie ? Tak zeby grafik widzial, w ktory plik ma wejsc zeby mogl namieszac ?

Wystarczy mi sama informacja skad te informacje pobrac, dane do widoku sobie sam wprowadze.

Pozdrawiam

Nie ma chyba sensu “wstrzykiwać” tego do widoku. Powinno Ci wystarczyć osobne okienko terminala z czymś w stylu:

$ tail -f log/development.log | grep 'Rendering'

Dziekuje, ten patent znam, chodzi mi o cos dzieki czemu grafik nie bedzie pod Windows musial odpalac putty zeby tailem logi czesac.

Zastanawiam sie nad przeladowaniem metody render…

Gdyby pobrac te dane i wstrzyknac do dokumentu html tak jak robi to na przyklad FiveRuns, grafik by mial rozeznanie prosto z przegladarki.

Pozdrawiam

Layout powinienes miec w @_layout, co do reszty, to nawet ciezko bylo by sie wstrzelic w kod rederingu przez MP, jest on strasznie zasyfiony od poczatku samego rails i dopiero w Rails 3.0 widac swiatelko w tunelu na lad i porzadek redneringu widokow i partiali (wiekszosc pracy zostala juz wykonana). Narazie zostaje tylko logger.

Albo 1 h rozmowa z grafikiem na temat jak działa Rails i gdzie powinien szukac template’ow dla danego url’a.

Hosiawak, chciałbym współpracować z tymi samymi grafikami :wink:
1h tłumaczenia…

albo sam jesteś programistą i grafikiem :slight_smile:

Najgorsza dwuklasowość świata, gorsza chyba nawet od fighter-druid :wink:

Albo 1 h rozmowa z grafikiem na temat jak działa Rails i gdzie powinien szukac template’ow dla danego url’a.[/quote]
Tak, na pewno mu wytlumaczysz, zwlaszcza jak masz aliasy albo inne cuda na kiju w routingu :slight_smile:
Tak jak pisalem wczesniej, nie zawsze mozna latwo odczytac layout w zaleznosci od url’a.
Chocby layouty przelaczane (osobny layout dla zalogowanego/niezalogowanego), na pewno grafik zrozumie ze trzeba przejsc do kontrollera, znowu ktorego ;), i sprawdzic nazwe layoutu (przyjmujac ze zrozumie choc troche kod, ktory ten layout przelacza), pytanie tylko po co ?

Grafik tez sie nade mna nie zneca i nie kaze mi pisac hakow pod kIEpskiego :slight_smile:

Uszanujmy wiec prace grafikow i ulatwmy im troche zycie :slight_smile:

[code] before_filter :in_logger
after_filter :out_logger

class DummyLogger
def initialize
@buffer = []
end

def write(message)
  @buffer << message
end

def write?
  true
end
alias_method(:info, :write)
alias_method(:info?, :write?)
alias_method(:fatal, :write)
alias_method(:fatal?, :write?)

end

def in_logger
@old_rails_logger = RAILS_DEFAULT_LOGGER
Object.const_set “RAILS_DEFAULT_LOGGER”, DummyLogger.new
true
end

def out_logger
Object.const_set “RAILS_DEFAULT_LOGGER”, @old_rails_logger
end[/code]
Kod jest hardcorowy i nie zalecany w srodowiskach produkcyjnych :wink:

Wstawiasz to do ApplicationController, powiniens miec przy kazdej akcji 2 logi o renderingu (layout/akcja) i 2 warningi :stuck_out_tongue: Niestety z uwagi na zbyt wielka pojebanosc ActionView nie udalo mi sie w zaden sposob nadpisac logger’era ta aby wylapywac info o renderingu partiali.

Prosciej chyba bedzie nadpisac BufferedLogger tak aby wrzucal buffor do jakiejs zmiennej w momencie jej ustawienia.

Ha!

To na koniec environment.rb

[code]module ActiveSupport

Inspired by the buffered logger idea by Ezra

class BufferedLogger
attr_accessor :second_buffer

def flush
  @guard.synchronize do
    unless buffer.empty?
      old_buffer = buffer
      @log.write(old_buffer.join)
      @second_buffer << old_buffer.join if @second_buffer
    end

    # Important to do this even if buffer was empty or else @buffer will
    # accumulate empty arrays for each request where nothing was logged.
    clear_buffer
  end
end

end
end[/code]
A to do ApplicationController

[code] before_filter :in_logger

def in_logger
@action_log = []
logger.second_buffer = @action_log
end[/code]
Potem juz tylko wystarczy w layoucie dac

<%= @action_log.grep(/Render/).join("<br>") %>

I mamy

Rendering template within layouts/application
Rendering tickets/index
Rendered tickets/_list (121.1ms)
Rendered shared/_pagination (0.1ms)
Rendered tickets/_administration_sidebar (0.7ms)
Rendered tickets/_sidebar (3.0ms)

Polecam też plugin footnotes, który to w stopce dodaj linki właśnie do aktualnie renderowanego widoku, wywołanego kontrollera, parametrów sesji i kilka innych przydatnych informacji. W dodatku można skonfigurować go, tak aby po klikniecie w link “Widok” automatycznie otwierał nam renderowany widok w naszym edytorze :]

Wlasnie o cos takiego chodzilo ! Bardzo dziekuje :slight_smile:

Zdziwila mnie jednak jedna rzecz:

Tworzymy strone, ktora ma nawigacje na wzor menu gornego http://www.samsung.com/pl/index.html, czyli jest masa linkow z kategoriami w widoku.

Korzystam z friendly_id dla potrzeb SEO, w development.log mam cala mase zapytan typu

SELECT * FROM slugs WHERE (slugs.sluggable_id = 194 AND slugs.sluggable_type = ‘Category’) ORDER BY id DESC LIMIT 1

Zapewne jest to spowodowane tym iz w widoku w petli wywoluje linkt_to(category.name, category_path(category))…

Nic by w tym dziwnego nie bylo, gdyby nie fakt, iz bez rails-footnotes strona laduje sie blyskawicznie (localhost), natomiast z rails-footnotes, strona otwiera sie prawie 10 sekund, samych zapytan do bazy jest ponad 200, ktore lacznie trwaja tyle czasu.

Uno: Dlaczego rails-footnotes tak znacznie wydluza czas dostepu do bazy danych ?

Secundo: Jak usprawnic czesanie kategorii z bazy zeby tak po niej nie rzezbic podczas generowania linka do kategorii ? (Wiem ze nie na temat, ale nie chce zakladac nowego watku z tym samym problemem, jesli kogos razi w oczy to wyedytuje i przeniose)

Pozdrowienia

Jeżeli chodzi o drugie pytanie, tam gdzie pobierasz kategorie:

@categories = Category.find(:all, :include => :slug)

Zakładając, że istnieje asocjacja slug. To pobierze w dodatkowym zapytaniu sluga dla wszystkich pobranych kategorii. Poczytaj więcej o :include w dokumentacji railsów, to jeden z najprostszych i najczęściej stosowanych zabiegów optymalizacyjnych.

Dziekuje drogus za podpowiedz, po dluzszej zabawie udalo mi sie zminimalizowac liczbe zapytan do 12tu.

Mam jeszcze cos takiego w logach:

[quote]SELECT * FROM slugs WHERE (slugs.sluggable_id = 29 AND slugs.sluggable_type = ‘Category’) ORDER BY id DESC LIMIT 1
SELECT * FROM slugs WHERE (slugs.sluggable_id = 187 AND slugs.sluggable_type = ‘Category’) ORDER BY id DESC LIMIT 1
SELECT * FROM slugs WHERE (slugs.sluggable_id = 162 AND slugs.sluggable_type = ‘Category’) ORDER BY id DESC LIMIT 1
SELECT * FROM slugs WHERE (slugs.sluggable_id = 10 AND slugs.sluggable_type = ‘Category’) ORDER BY id DESC LIMIT 1[/quote]
Widac ze bierze to z nastepujacego widoku (mam 4 produkty w bazie):

<% for product in @products_puls %> <li> <div class="thumbnail"> <%= link_to_unless_current(image_tag(product.photo.url(:thumb)),product_path(product)) %> </div> <div class="info"> <%= link_to_unless_current(product.name,product_path(product)) %> <span class="cat"><%= link_to_unless_current(product.category.name,category_path(product.category)) %></span> </div> <div class="clear"></div> </li> <% end %>
Gdzie @products_puls
wyglada tak:

def products_puls @products_puls = Product.find(:all, :include => :slugs) end
Da sie sensownie zminimalizowac te cztery zapytania ? Bo jesli produktow byloby 100, to jak rozumiem poszloby 100 zapytan do bazy ?

proboowalem:

def products_puls @products_puls = Product.find(:all, :include => [:slugs,:category]) end
Ale nic to nie dalo… oczywiscie Product belongs_to :category oraz Category has_many :products

Z gory dziekuje za cenne wskazowki,
Pozdrawiam

P.S Zapomnialem dodac, iz powyzsze logi wyczesalem wygodnie za pomoca rails-footnotes :slight_smile:

Ten slug pobiera się dla kategorii, dlatego dla kategorii musisz zrobić dodać slug:

@products = Product.find(:all, :include => [:slug, {:category => :slug}])

To powinno pomóc.

A dlaczego masz :include => :slugs dla produktu? Możesz wkleić tutaj asocjacje jakie masz w modelach?

Update: i jeszcze jedno pytanie - dlaczego właściwie trzymasz slugi w oddzielnej tabeli? ma to jakieś zalety, które przykrywają czasożerność (dodatkowe zapytania) i skomplikowanie (dodatkowy model, dodatkowy kod jako :include chociażby) ?

[quote=drogus]Ten slug pobiera się dla kategorii, dlatego dla kategorii musisz zrobić dodać slug:

@products = Product.find(:all, :include => [:slug, {:category => :slug}])

To powinno pomóc.[/quote]
Masz racje, dziekuje pomoglo

Nic nadzwyczajnego, moge wkleic jesli zachodzi potrzeba, aczkolwiek korzystam po prostu z friendly_id plugin, on sobie trzyma slugi w osobnej tabeli.

Jak wyzej :slight_smile: Chyba ze mozesz zaproponowac lepsze rozwiazanie ?

Pozdrowienia