2010-08-18 17 views
-4

Je fais un bref exercice, condensé ci-dessous. Le problème que je suis est que je suis en mesure de passer une sélection de tous les billets, mais pas une sélection d'un billet. A/il n'y a pas de problème la liste de tous les billets, au point final pour un billet que je reçois:Sinatra, sélectionnez de Datamapper passer à Haml

NoMethodError at /pi2l9ulnw 
undefined method `slug' for #<Enumerable::Enumerator:0x7f04eb043b88> 

Je suis relativement nouveau à Ruby et de copier-coller, mais il semble passer @ticket pour obtenir @ticket.slug est juste de la Documentation Sinatra. Je suis arrivé à ce point et j'ai atteint une impasse où j'essaie de créer un point de terminaison simple pour 1 ticket. Toutes les suggestions pendant que j'essaye de lire ce que je fais, merci.

Exemple ci-dessous condensé 1 fichier:

require 'rubygems' 
require 'sinatra' 
require 'haml' 
require 'dm-core' 
require 'dm-validations' 
require 'dm-types' 
require 'dm-migrations' 
require 'sqlite3' 

configure do 
class Ticket 
    include DataMapper::Resource 

    property :id, Serial         # unique key 
    property :slug, String         # unique slug as endpoint 
    property :created_at, DateTime       # created 
    property :content, Text        # content of ticket 

    validates_uniqueness_of :slug 
end 

    set :sessions , true 
    DataMapper::Logger.new($stdout, :debug) 
    DataMapper.setup(:default , "sqlite3://#{Dir.pwd}/development.sqlite3") 
    DataMapper.finalize 
    DataMapper.auto_upgrade! 
end 

error do 
    e = request.env['sinatra.error'] 
    Kernel.puts e.backtrace.join("\n") 
    'Application error' 
end 

helpers do 
    def sluggenerate 
    rand(2**256).to_s(36)[0..8] 
    end 
end 


get '/' do 
    @tickets = Ticket.all(:order => [ :created_at.desc ]) 
    haml :index 
end 

get '/new' do 
    haml :new 
end 

post '/new' do 
    p params 
    @ticket = Ticket.new(:slug => sluggenerate,:content => params[:content]) 
    if @ticket.save 
     redirect '/' 
    else 
     redirect '/new' 
    end 
end 

get '/:slug' do 
    @ticket=Ticket.find(params[:slug]) 
    haml :ticket 
end 

__END__ 

@@ layout 
%html 
= yield 

@@ new 
%h1 NEW TICKET 
%form{:action => '/new', :method => 'post'} 
    %p 
    %input{:type => "text", :name => "content", :id => "content" } 
    %input{:type => "submit", :value => "post"} 

@@ index 
%div{:class => "tickets"} 
- @tickets.each do |ticket| 
    %div{:class => "ticket"} 
    %h2 
    %a{:href => "/#{ticket.slug}" } 
    = ticket.slug 
    %div{:class => "tickettime"} 
    = ticket.created_at 
    %div{:class => "ticketcontent"} 
    = ticket.content 

@@ ticket 
%div{:class => "ticket"} 
    = @ticket.slug 
+0

Hey, une chance vous pourriez marquer quelle réponse est la vôtre est correcte? Je suis intrigué quant à ce qui l'a réparé :) – Tom

Répondre

0

Changé

@@ ticket 
%div{:class => "ticket"} 
    = @ticket.slug 

à

@@ ticket 
%div{:class => "ticket"} 
- @ticket.each do |ticket| 
%h1 
    = ticket.slug 

et il fonctionne

+0

un peu sorta fonctionne, mais pas - Je suis coincé avec seulement 1 ticket à tous les points de terminaison, le premier que je sélectionne qui est un nouveau problème. – anastazja

+0

C'est vraiment ennuyeux, je ne passe pas ou je ne déballe pas @ticket correctement. – anastazja

0

Peut-être le problème est dû à la construction du modèle et qu erying avec DM (il y a des informations de base sur le site, mais regarder plus loin pour info a fait peur de dire le moins de pages de classes rdoc et méthodes qui ne pointent nulle part pour le niveau de base que je suis)

Ticket.get (params [: slug]) donne une sorte d'erreur null - la requête ne tire rien, peut-être que 'slug' doit être transformé en une sorte de clé?

0
get `/:slug' do 
    @ticket=Ticket.first(:slug=>params[:slug]) 
    haml '%h1= @ticket.slug' 
end 

et variations rendent parfaitement, de sorte qu'une partie de la question peut être inappropriée avec DM interrogation