Kilka pytan odnosnie zmiennych

Hej,
zastanawialem sie, jak mozna:

  1. przeslac wiele zmiennych w jednym linku, tzn: controller/action/zmienna1/zmienna2/zmienna3
    czy jest to jakos mozliwe, czy trzeba po prostu liczyc na controller/action/zmienna1?zmienna2&zmienna3 ???

  2. czy jest jakas funkcja, sprawdzajaca, czy zmienna jest ustawiona? W PHP robilo sie to za pomoca isset() albo empty(), jednak trudno mi znalezc na googlach odpowiedz na to pytanie

  3. jakim atrybutem powiniennem sie posluzyc jezeli chce, zeby zmienna zostala w url przeslana jako integer? jak przesylam np:
    <%= link_to “page”, :action=>:hello, :id => :year %>, parametr id jest odczytywany jako string

Jakbyscie mogli pomoc

Witamy w świecie rubiego, lepszym świecie ;).

[quote=szef]Hej,
zastanawialem sie, jak mozna:

  1. przeslac wiele zmiennych w jednym linku, tzn: controller/action/zmienna1/zmienna2/zmienna3
    czy jest to jakos mozliwe, czy trzeba po prostu liczyc na controller/action/zmienna1?zmienna2&zmienna3 ???[/quote]
    Możesz to zrobić i tak i tak. Z tym, że drugi sposób jest łatwiejszy bo jak będziesz np taki link: http://…/controller/action?par1=val1&par2=val2 to nie musisz robić nic szczególnego, a do wartości zmiennych dobierasz poprzez params[:par1], params[:par2] itp. Gdybyś chciał mieć linki w postaci http://…/controller/akcja/par1/val1/par2/val2 to musisz już zdefiniować dodatkowe ściezki (routes) w pliku config/routes.rb. Poczytaj o tym np tu: http://manuals.rubyonrails.com/read/chapter/65. Jednakże polecam Ci dla zwykłych parametrów zastosować klasyczne podejście.

W rubym też możesz:

[code=ruby]if defined?(x)
puts “x jest zdefiniowaną zmienną o wartości #{x}”
else
puts “x nie jest zdefiniowaną zmienną”
end

x = 1

if defined?(x)
puts “x jest zdefiniowaną zmienną o wartości #{x}”
else
puts “x nie jest zdefiniowaną zmienną”
end[/code]
Jednakże prawdopodobnie nie do końca o to pytasz. Zapewne chcesz m.in. sprawdzić czy jakiś parametr został podany w adresie itp. W php sprawdzasz to poprzez isset($_GET[‘x’]). W railsach do parametrów dobierasz się poprzez hash, do którego dobierasz się poprzez metodę params. Jeśli chcesz sprawdzić czy dany parametr zostsał podany wystarczy, że sprawdzisz czy ma wartość nil (a jak ma tzn że nie został podany).

class TestController < ActionController::Base def index if params[:x].nil? render :text => "nie podałeś parametru x!" else render :text => "x = #{params[:x]}" end end end
Zwróć po prostu uwagę, że ciężko tu mówić o sprawdzaniu “czy zmienna jest ustawiona”. Raczej rzadko to się zdarza, bo programując wiesz jakie zmienne i gdzie używasz, a najprawdopodobnie inicjalizujesz je na poczatku np wartością nil. Tutaj sprawdzasz tak na prawdę obecność klucza w hashu (w php robisz dokładnie tak samo, ale nazwane jest to inaczej - i jest to błąd).

[quote=szef]3) jakim atrybutem powiniennem sie posluzyc jezeli chce, zeby zmienna zostala w url przeslana jako integer? jak przesylam np:
<%= link_to “page”, :action=>:hello, :id => :year %>, parametr id jest odczytywany jako string[/quote]
No to chcesz przesłać czy odczytać? Rozumiem, że jednak odczytać. Każda wartość odczytana poprzez params[:x] jest stringiem. Railsy nie próbują ingerować w to co tam przesyłasz i w jakiś magiczny sposób to interpretować. To, że przesyłana jest liczba nie oznacza, że ma być liczbą itp. To co możesz zrobić to spróbować skonwertować string do wartości numerycznej w następujący sposób:

s = "123" puts s.to_i puts Integer(s)
Ta druga wersja w przypadku stringa niebędącego poprawnym zapisem liczby rzuca wyjątek, ta pierwsza zwraca “tyle ile może” (np “123aa”.to_i zwróci 123).

Dzieki wielkie, wszystko dziala, jak nalezy. A te routes to na serio swietna sprawa:)

Dopiero co uczę się Rails więc robię pewnie jakiś podstawowy błąd którego nie umiem zidentyfikować.
W jednym widoku mam coś takiego: <% for message in list_messages %> <% if current_user.id == message.id_recepient %> <% @id_message = message.id %> <li><a href="http://localhost:3000/messcontent?par=<%= @id_message %>"><%= message.subject %></a></li> <% end %> <% end %>
Czyli wypisuje tematy wiadomości jakie zostały przesłane. W linku trzymam id wiadomości. Klikając na link otwiera mi się drugi widok:

<% for message in list_messages %> <% @parameter = params[:par] %> <% if message.id == @parameter %> <%= message.content %> <% end %> <% end %>
Tutaj chce wyświetlić treść właściwej wiadomości. Przeglądam wszystkie wiadomości i jeżeli id wiadomości równa się liczbie z parametru to wtedy ją wyświetlam. Problem jest w tym, że zmienna @parameter nie chce działać. Jeżeli wyświetlę ją tak: <%= @parameter %> to wyświetla prawidłowo. A jeżeli porównuję w if’e to tego nie robi. Sprawdzałem już wszystko, napewno chodzi o zmienna @parameter. Tak jak napisałem pewnie chodzi o jakąś dobnostkę o której ja, początkujący jeszcze nie wiem.

Strzelam, że:

message.id.class => Fixnum @parameter.class => String 1 == "1" => false

To jeżeli tak jest, to jak to rozwiązać?

W Ruby wszystko dziedziczy po klasie Object, która do definiuje metody to_s i to_i.

"5".to_i => 5 6.to_s => "6" 5.to_s == "5" => true
Polecam korzystanie z apidock.com jest tam fajna wyszukiwarka metod, powinno Ci pomóc

O to chodziło właśnie, dzięki bardzo za pomoc. Ale coś nie działa ta strona:/