Primi passi con rails

Ciao a tutti,

Mi presento, sono un nuovo iscritto a questa mailing list, la mia
giornata lavorativa consiste nell’usare il linguaggio java per lo
sviluppo di gestionali.

Recentemente ho seguito qualche presentazione di Rails e mi è venuta
voglia di provarlo, anche se purtroppo non ho nessun progetto in
cantiere con questo framework.

Sto leggendo “Agile Web D. with Rails” e ho iniziato a leggerlo
senza avere la minima conoscenza di ruby, però il libro sembra fatto
abbastanza bene e per ora (pag 82) non ho avuto alcun problema.

Però ho qualche problema con Rails.

Sto facendo l’esempio del Books Online Store e non riesco a visualizzare
lo unit_price. Mi spiego meglio ho questa schermata qua:

    <h1>Display Cart</h1>
    <table>
    <%
    for item in @items
      product = item.product
    -%>
      <tr>
        <td><%= item.quantity %></td>
        <td><%= h(product.title) %></td>
        <td><%= item.unit_price %></td>
      </tr>
    <% end -%>
    </table>

Però la terza riga causa un errore che porta webrick a mostrarmi una pagina
di errore con scritto “We’re sorry, but something went wrong.”, che per
un programmatore è assolutamente inutile, si può far visualizzare lo
stacktrace ?
Comunque togliendo la riga dello item.unit_price tutto funziona
correttamente.

Questo è lo store_controller:
class StoreController < ApplicationController

def index
@products = Product.salable_items
end

def add_to_cart
render :action => ‘ciao’
end

def add_to_cart
product = Product.find(params[:id])
@cart = find_cart
@cart.add_product(product)
redirect_to(:action => ‘display_cart’)
end

def display_cart
@cart = find_cart
@items = @cart.items
end

private
def find_cart
session[:cart] ||= Cart.new
end

end

Questa è la classe LineItem:

class LineItem < ActiveRecord::Base

belongs_to :product

def self.for_product(product)
item = self.new
item.quantity = 1
item.product = product
item.unit_price = product.price
item
end
end

Qeusta invece è la classe Cart:

class Cart

attr_reader :items
attr_reader :total_price

def initialize
@items = []
@total_price = 0.0
end

def add_product(product)
@items << LineItem.for_product(product)
@total_price += product.price
end
end

Il nome della colonna è uguale a quella su db (mysql 5) e sono entrambe
dello stesso tipo DECIMAL(10, 2). Sono su Ubuntu 7.04 e sto usando JRuby
1.0.1 presente su Netbeans 6 beta.
Quando provo a far partire in debug l’applicazione, Netbeans mi dice che
JRuby non supporta il debug, è normale ? Mi pare strano …

Un’altra cosa strana è che non riesco a cancellare elementi, l’action
destroy, generata automaticamente non esegue la cancellazione ma non
causa nessun errore, semplicemente non succede nulla.
Questa è l’action “incriminata”:
def destroy
Product.find(params[:id]).destroy
redirect_to :action => ‘list’
end

e questo il link all’action della pagina rhtml:
<%= link_to ‘Destroy’, { :action => ‘destroy’, :id => product },
:confirm => “Are you sure?” %>

Son certo di essere stato prolisso, scusatemi ma avevo molti dubbi,
grazie a tutti in anticipo,
–gm

Sto facendo l’esempio del Books Online Store e non riesco a
visualizzare lo unit_price. Mi spiego meglio ho questa schermata qua:

    <h1>Display Cart</h1>
    <table>
    <%
    for item in @items
      product = item.product
    -%>

Questa riga mi pare un po’ strana…
Prova a sostituire con:
<% for item in @items %>

      <tr>
        <td><%= item.quantity %></td>
        <td><%= h(product.title) %></td>

…e questa sopra con:

<%=h item.product.title %>
        <td><%= item.unit_price %></td>

Questa ti dà errore?
Verifica nella console:
script/console
i = LineItem.find :first
i.unit_price

Ah, aspetta… ho letto meglio sotto. Mi sa che il tuo model non funzia.

  • il Cart ha un getter (un attr_reader in Ruby) ma non è legato al DB
    => togli attr_reader :items
    => Cart has_many :line_items
    => LineItem belongs_to Cart
    => aggiungi migrations per rispecchiare quanto sopra
    (In questo modo la tabella line_items funziona come un join table
    ‘ricco’ per la relazione n:m tra Cart e Product e potrai fare
    Cart has_many :products, :through => line_items cosicché potrai fare cose
    come:
    prezzi = Cart.find(:first).products.map(&:price) # Array dei prezzi di
    tutti prodotti del primo Cart nel db
    )

  • usi “items”, ma in realtà vuoi accedere ad un collection di istanze di
    LineItem; rails ti vuole molto più meglio se chiami le robe con il loro
    nome… :wink:

  • destroy vorrà essere chiamato con un HTTP DELETE e non un GET come fai
    tu qua sotto; aggiungi un :method => :delete e vedrai che va meglio

  • destroy ritorna l’oggetto cancellato o nil (==false in Ruby), quindi
    metti lo in una condizionale:
    def destroy
    if Product.find(params[:id]).destroy

    do stuff

    else

    other stuff

    end
    end

  • infine qualche consiglio:

    1. usa script/console per giocare con i model ed assicurati che tutto
      ‘gira’ prima di fare controller/view
    2. tail -f log/development.log is your friend!
    3. non vedi i stacktrace nel browser? Mi sa che stai girando in
      production mode e non in development mode

[email protected] ha scritto:

Però la terza riga causa un errore che porta webrick a mostrarmi una pagina di errore con scritto “We’re sorry, but something went wrong.”, che per un programmatore è assolutamente inutile, si può far visualizzare lo stacktrace ?

Prova a dare un’occhiata in log/development.log :wink:


blog: www.lucaguidi.com

Speaker at:
Rails To Italy '07 Conference
Oct, 26-27 2007 - Pisa
www.railstoitaly.org

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs