🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.ruby
4 messages
4 total messages Started by RaW Tue, 14 Nov 2006 19:59
RoR - problem z select
#294
Author: RaW
Date: Tue, 14 Nov 2006 19:59
40 lines
2066 bytes
Stan rzeczywisty katalogu:
$ ls -la
drwxr-xr-x 4 raw raw  4096 2006-11-14 00:00 .
drwxr-xr-x 5 raw raw  4096 2006-09-25 20:34 ..
drwxr-xr-x 2 raw raw  4096 2006-10-25 08:57 200406
-rw-r--r-- 1 raw raw  7800 2006-11-01 09:40 ajer.gif
-rw-r--r-- 1 raw raw  2550 2006-11-01 09:37 ajer_mini.gif
drwxr-xr-x 2 raw raw  4096 2006-11-14 00:00 test

Pod irb:
irb(main):001:0> Dir.foreach("./") {|f| (puts f) if File.directory?(f)}
.
..
200406
test
=> nil

Fragment kodu aplikacji w RubyOnRails:
<% dirs = [] %>
<% Dir.foreach("./") {|f| dirs.push(f) if File.directory?(f) }%>
<%= select 'photo', 'dirname', dirs, :id => 'photo_dirname' %>

Generowany kod HTML (i tu jest problem - brak katalogu 200406):
<select id="photo_dirname" name="photo[dirname]">
<option value=".">.</option>
<option value="..">..</option>
<option value="test">test</option></select>

To tylko przykład - do katalogu dodałem jeszcze kilka innych 
podkatalogów o różnych nazwach (nie tylko złożonych z cyfr) i efekt był 
tak samo dziwny - w select pojawiają się tylko niektóre z nich.
Bez warunku:
  if File.directory?(f)
wyswietla się poprawnie cała zawartość katalogu.
Czy ktoś może mnie oświecić co robię źle? Moim zamiarem jest oczywście 
umieszczenie w select wszystkich podkatalogów (i tylko katalogów).

Z góry dzięki za odp
-- 
RaW
Re: RoR - problem z select
#295
Author: Jaroslaw Zabiello
Date: Wed, 15 Nov 2006 15:48
26 lines
1537 bytes
Dnia Tue, 14 Nov 2006 20:59:53 +0100, RaW napisał(a):

> Fragment kodu aplikacji w RubyOnRails:
> <% dirs = [] %>
> <% Dir.foreach("./") {|f| dirs.push(f) if File.directory?(f) }%>
> <%= select 'photo', 'dirname', dirs, :id => 'photo_dirname' %>
> 
> Generowany kod HTML (i tu jest problem - brak katalogu 200406):

Dla pewności sprawdź wpierw czy faktycznie masz wszystko co trzeba zanim
wejdziesz w metodę select. Dlaczego podajesz parametr './'? Przecież
wystarczy sam '.'.

<%= debug dirs %>

BTW, ja bym się pozbył niepotrzebnej zmiennej

<%= select 'photo', 
           'dirname', 
            Dir.entries('.').map {|f| f if File.directory?(f)}.compact, 
           :id => 'photo_dirname' %>


-- 
Jarosław Zabiełło
http://blog.zabiello.com
Re: RoR - problem z select
#296
Author: RaW
Date: Wed, 15 Nov 2006 17:03
43 lines
2483 bytes
Jaroslaw Zabiello napisał(a):
> Dla pewności sprawdź wpierw czy faktycznie masz wszystko co trzeba zanim
> wejdziesz w metodę select. Dlaczego podajesz parametr './'? Przecież
> wystarczy sam '.'.
> 
> <%= debug dirs %>
> 
> BTW, ja bym się pozbył niepotrzebnej zmiennej
> 
> <%= select 'photo', 
>            'dirname', 
>             Dir.entries('.').map {|f| f if File.directory?(f)}.compact, 
>            :id => 'photo_dirname' %>
> 
> 
Teraz widzę jak bardzo byłem zmęczony tworząc poprzedni post.
Faktycznie problem nie leży w samym select, lecz w stringu okreslającym 
ścieżkę. Jeśli nie jest to bieżący katalog a ścieżka, to zaczynają się 
problemy. W poprzednim poście w cytacie kodu aplikacji ROR skróciłem 
zawartość ścieżki do './' dezorientując trochę wszystkich - przepraszam.

Tymczasem, poczyniłem następujące obserwacje:

irb(main):001:0> Dir.pwd
=> "/home/raw"
irb(main):002:0> Dir.entries("./workspace/ajer/public/images").map{|f| f 
if File.directory?(f)}.compact
=> [".", ".."]
irb(main):003:0> Dir.chdir "./workspace/ajer/public/images"
=> 0
irb(main):004:0> Dir.entries(".").map{|f| f if 
File.directory?(f)}.compact => [".", "..", "200406", "200407"]

W aplikacji można użyć oczywiście takiego myku ze zmianą katalogu i 
wywołać iterator w katalogu bieżącym (działa - sprawdziłem) ale to chyba 
nie jest ładne rozwiązanie?
Wygląda mi to na jakąś niezgodność typu argumentu przekazywanego w 
metodzie entries(), ale nie bardzo mam pojęcie co z tym zrobić i czy w 
ogóle mam dobry trop.
Będę wdzięczny za pomoc.

-- 
RaW
Re: RoR - problem z select
#297
Author: Marcin Mielżyński
Date: Wed, 15 Nov 2006 19:02
38 lines
1850 bytes
RaW wrote:

> Tymczasem, poczyniłem następujące obserwacje:
> 
> irb(main):001:0> Dir.pwd
> => "/home/raw"
> irb(main):002:0> Dir.entries("./workspace/ajer/public/images").map{|f| f 
> if File.directory?(f)}.compact
> => [".", ".."]

zachowuje się jak najbardziej poprawnie - skąd File.directory? ma 
wiedzieć że 200406 jest gdzieś wpisem w kosmosie (głęboko strukturze) ?


> irb(main):003:0> Dir.chdir "./workspace/ajer/public/images"
> => 0
> irb(main):004:0> Dir.entries(".").map{|f| f if 
> File.directory?(f)}.compact => [".", "..", "200406", "200407"]
> 

btw. ten map jest zupełnie nie na miejscu ;)

najwygodniej trzymać kontekst w łańcuchu i sumować za każdym razem:

dir = "/somedir"

p Dir.entries(dir).select{|f|test(?d,"#{dir}/#{f}")}


można też trzymać kontekst w instancji Dir:

d = Dir.new(dir)

problem w tym że instancje Dir mają mało pożytecznych metod



lopex
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads