ugrás a tartalomhoz

Ruby on Rails kérdés 1

Kael · 2010. Okt. 14. (Cs), 14.30
Kedves Segítőkész programozótársak,

Elkezdtem ismerkedni a csudás Railsel, de még szokom a rendszert.
Gondoltam kezdésnek összerakok egy oldalt, ami kártyákat sorsolgat.
Előre is köszi, ha elolvasod a postom és elgondolkodsz egy megoldáson!!

Rendszer:
rails 2.2.2
ruby 1.8.6
Mongrel 1.1.2

Tehát:
Van egy formom a /joslas/index.html.erb-n belül.
Ebben a formban a form_tag-et használom, vagyis nem kérek adatokat a modellből.

A mezők:
Header: Tarot Joslas
Text: Kerdes
Collection: Kirakas
Submit: Josolj

A gond:
az, hogy a form-ban lehet válsztani egy dropdown list-ből, hogy milyen kirakás szerint működjön az oldal. Ehhez viszont a form_for-ra van szükség, és a form.select-el veszem ki az értékeket a modellből.
Ha a user megnyomja a submint gombot, akkor a form_tag-ben meghatározott :action => 'tarot' szerint elküldi a joslas/tarot.html.erb viewra.
Azt nem tudom viszont, hogy hogyan kérhetem le azt az értéket, amit a collectionben kiválasztott a user!
Vagyis a Text: Kerdes mezőt így kérdezem meg: params[:kerdes], ahogy az meg van határozva szépen. De hogyan tudom megkérdezni milyen kirakást választott a dropdown listből?

Valamint ha submit-olom a formot akkor a következő hibát dobja:
ArgumentError in JoslasController#tarot
bad value for range
Parameters:
{"commit"=>"Josolj",
"kiraka"=>{"id"=>"1"},
"authenticity_token"=>"ea2c3d0fc261e50f75c2acf3848ee2d3f5710c0e",
"kerdes"=>""}



A kódok:
josolj/index.html.erb

<div id="kozepso">
<% form_tag :action => 'tarot' do %>
<fieldset>
<legend>Tarot Joslat</legend>
<div>
<label for="kerdes">Kerdes:</label>
<%= text_field_tag :kerdes, params[:kerdes]%>
</div>
<div>
<label for="kirakas">Kirakas:</label>

<% form_for :kiraka do |form| %>
<%=
@k = Kiraka.find(:all, :order => "id").map {|k| [k.nev, k.id]}
form.select(:id, @k,{:include_blank => true})
%>
<%end%>
</div>
<div>
<%= submit_tag "Josolj" %>
</div>
</fieldset>
<% end %>
</div>

-----------------------------------

josolj/tarot.html.erb

<div id="kozepso">
<%=@semmi = params[:kiraka].id%>
<%
@akarmi = Array.new
for kartyaszam in @kartyaszamok do
@card = Card.find_by_id(kartyaszam)
@forditott = rand(2)
if @forditott == 0
@kep = @card.image_url+".jpg"
@kszoveg = @card.allo
@akarmi << @kep
else
@kep = @card.image_url+"_f.jpg"
@kszoveg = @card.ford
@akarmi << @kep
end
%>

<div id="kozepso_tarot_sor">
<div id="kozepso_tarot_kep">
<%= image_tag @kep %>

</div>
<div id="kozepso_p_jobbra">
<p><%= @kszoveg %></p>
</div>
</div>

<%end%>
</div>

-----------------------------------------

controller/joslas_controller.rb

class JoslasController < ApplicationController

def index
end

def tarot
cardnums = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72]
@kartyaszamok = cardnums.sort_by{rand}[1..@n]
end


end

Köszi##
Kael
 
1

LVL 2

Kael · 2010. Okt. 14. (Cs), 15.27
Közben változott a helyzet. Rájöttem, hogy a controller-ben a
@kartyaszamok = cardnums.sort_by{rand}[1..@n]
sorban van egy @n ami nem jó, az okozza az argument errort. Ezt vissza állítottam 10-re ahogy eredetileg volt. Így már lefut a kód. Átadja a változókat a params-ban.
Az agile web development könyv 541-es oldalán a fomr collection-ről ír. Azt mondja, hogy a
Product.update(params[:product].keys, params[:product].values)
módszerrel lehet elérni a collection-ben lévő adatokat.

Erre én:
a tarot.html.erb elejére tettem ezt a sort:
<%=@semmi = params[:kiraka].id%>

ami viszont egy 8 jegyű számsort ad vissza.
A megoldást egy fórumon találtam meg.

A params[:kiraka][:id]-vel megkapom a collection-ben lévő adatokat. Ha jól értem a hash-be létrehoz egy másik hash-t amit így érhetek el.
Csak azért írtam le, hogy ne fáradjatok az olvasgatással, meg ha valaki megtalálja egyszer, legyen itt a válasz is.