7
Oct

———————————————————–

….Leggi la prima parte di questo articolo qui.

———————————————————–

La pagina che elenca le ricette ha sicuramente bisogno di miglioramenti grafici , perciò apriamo recipe_controller.rb e aggiungiamo un nuovo metodo list in questo modo:

Def List

All’ indirizzo http://127.0.0.1:3000/recipe/list otterremo:

Template Missing

Manca infatti la classe list che abbiamo appena creato ma non ancora definito!
Quando abbiamo creato il nostro controller per ricetta, lo script che lo ha generato, ha creato anche una cartella view dove possiamo trovare il template html che il controller visualizza.
Dobbiamo creare un template html nella cartella C:rubyricettarioappviewsrecipe , contenuto in un file list.rhtml. Sarà una pagina con l’ html integrato da ruby. Le integrazioni di Ruby saranno contenute tra i tag <%  %> e <%=  %> e il codice di list.rhtml sarà:

<html>

<head>

<title>Tutte le ricette</title>

</head>

<body>

<h1>Ricettario on line – Tutte le ricette</h1>

<table border=”1″><tr><td width=”80%”>

<p align=”center”><i><b>Ricetta</b></i></td><td width=”20%”>

<p align=”center”><i><b>Data</b></i></td></tr><% @recipes.each do |recipe| %>%; <tr><td><%= link_to recipe.titolo, :action => “show”, :id => recipe.id %></td>t;<td><%= recipe.data %></td></tr><% end %></table><p><%= link_to “Crea una nuova ricetta”, :action => “new” %></p>

</body>

</html>

Modifichiamo il file recipe_controller.rb aggiungendo una singola linea di codice:

Controller

Il risultato:

ricettario.jpg

Digitando nel browser http://127.0.0.1:3000/recipe/list Rails invoca il metodo list di recipe. Nella definizione del nuovo metodo list:
  def list
    @recipes = Recipe.find_all
  end

Compare una sola linea di codice che chiede alla classe Recipe di elencare tutte le recipe presenti nel database assegnandole alla variabile @recipes
In questo modo Rails cerca un template per eseguire le richieste del browser. Il nostro template è pr la maggior parte in Html. Tutto ciò che fa Ruby è tra i tag:
<% @recipes.each do |recipe| %>
  <tr>
   <td><%= link_to recipe.titolo, :action => “show”, :id => recipe.id %></td>
   <td><%= recipe.data %></td>
  </tr>
 <% end %>

Questo codice interagisce con tutte le ricette trovate dal controller. Titolo, id e data sono i campi della tabella recipe creata nel database ricettario.
Aggiungiamo al database un’ altra tabella categories, con due campi: id e nome.
Abbiamo bisogno di creare un controller e un modello per la categoria:

ruby scriptgenerate controller Category
ruby scriptgenerate model Category

comandi da eseguire sempre nella cartella ricettario.
Aggiungiamo poi scaffold al controller di Category:

category_controller.jpg

All’ indirizzo http://127.0.0.1:3000/category/new possiamo creare una nuova categoria.
Assegnare una categoria ad ogni ricetta
Aggiungiamo un nuovo campo per la tabella recipes del nostro database, campo che conterrà l’ id della categoria. Il campo sarà category_id int(6). Poi dobbiamo scrivere l’ azione edit che avrà il compito di elencare le categorie. Prima modifichiamo c:rubyricettarioappmodelsrecipe.rb e c:rubyricettarioappmodelscategory.rb aggiungendo una singola riga di codice:

recipe1.jpg

In questo modo diciamo a Rails che una ricetta appartiene a una singola categoria e che una categoria può avere più ricette. Ora modifichiamo l’ azione edit per le ricette in c:railscookbookappcontrollersrecipe_controller.rb:

recipe_controller.jpg

In questo modo creiamo due variabili @recipe e @categories

Nella cartella c:rubyricettarioappviewsrecipe creiamo un file edit.rhtml che contiene il seguente codice HTML:

<html>

<head>

<title>Edit Recipe</title>

</head>

<body>

<h1>Edit Recipe</h1>

<form action=”../update/<%= @recipe.id %>” method=”POST”">

<input id=”recipe_id” name=”recipe[id]” size=”30″

type=”hidden” value=”<%= @recipe.id %>” />

<p><b>Title</b><br>

<input id=”recipe_title” name=”recipe[title]” size=”30″

type=”text” value=”<%= @recipe.title %>” />

</p>

<p><b>Description</b><br>

<input id=”recipe_description” name=”recipe[description]“

size=”30″ type=”text”

value=”<%= @recipe.description %>” />

</p>

<p><b>Category:</b><br>

<select name=”recipe[category_id]“>

<% @categories.each do |category| %>

<option value=”<%= category.id %>”

<%= ‘ selected’ if category.id == @recipe.category_id %>>

<%= category.name %>

</option>

<% end %>

</select></p>

<p><b>Instructions</b><br>

<textarea cols=”40″ id=”recipe_instructions”

name=”recipe[instructions]“

rows=”20″ wrap=”virtual”>

<%= @recipe.instructions %>

</textarea> </p>

<input type=”submit” value=”Update” />

</form>

<a href=”/recipe/show/<%= @recipe.id %>”>

Show

</a> |

<a href=”/recipe/list” mce_href=”/recipe/list”>

Back

</a>

</body></html>

All’ indirizzo http://127.0.0.1:3000/recipe/list possiamo modificare una ricetta

Modificando il file c:rubyricettarioappviewsrecipelist.rhtml in questo modo:

<html>
<head>
<title>All Recipes</title>
</head>
<body>

<h1>Online Cookbook – All Recipes</h1>
<table border=”1″>
<tr>
  <td width=”40%”><p align=”center”><i><b>Recipe</b></i></td>
  <td width=”20%”><p align=”center”><i><b>Category</b></i></td>
  <td width=”20%”><p align=”center”><i><b>Date</b></i></td>
</tr>

<% @recipes.each do |recipe| %>
  <tr>
   <td><%= link_to recipe.title, :action => “show”, :id => recipe.id %></td>
   <td><%= recipe.category.name %></td>
   <td><%= recipe.date %></td>
  </tr>
<% end %>
</table>
<p><%= link_to “Create new recipe”, :action => “new” %></p>

</body>
</html>

Abbiamo una lista delle ricette e possiamo crearne altre.

Questo tutorial è semplicemente una traduzione di quello che si trova qui.

E’ questa la mia prima applicazione realizzata in Ruby, utile per capire soprattutto le potenzialità di questo linguaggio.

Hey, non hai notato qualcosa di nuovo? Cosa ne pensi della nuova grafica? !

 

E tu cosa ne pensi?