Синатра, выберите из Datamapper передать в Haml - PullRequest
0 голосов
/ 19 августа 2010

Я делаю краткое упражнение, сжатое ниже. У меня проблема в том, что я могу передать выбор всех билетов, но не выбор одного билета. В / нет проблем с перечислением всех билетов, в конечной точке для билета, который я получаю:

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

Я относительно новичок в Ruby и копировании и вставке, но кажется, что пропуск @ticket для получения @ticket.slug прямо из документации Синатры. Я дошел до этой точки и зашел в тупик, где я пытаюсь создать простую конечную точку для 1 билета. Любые предложения, пока я пытаюсь прочитать, что я делаю, спасибо.

Пример ниже сжат в 1 файл:

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

Ответы [ 4 ]

0 голосов
/ 20 августа 2010

Ответ был в основном в запросе datamapper.

Безумно полезно, обнаружено по факту:

http://cheat.errtheblog.com/s/datamapper/

конец этой проблемы, может быть, кому-то пригодится

0 голосов
/ 19 августа 2010

Возможно, проблема в построении модели и запросах к DM (на сайте есть базовая информация, но искать информацию было страшно, если не сказать о страницах классов и методов rdoc, которые не указываютгде-нибудь для базового уровня, на котором я нахожусь)

Ticket.get (params [: slug]) выдает какую-то нулевую ошибку - запрос ничего не тянет, возможно, 'slug' нужно превратить в какой-то видключа?

0 голосов
/ 19 августа 2010
get `/:slug' do
    @ticket=Ticket.first(:slug=>params[:slug])
    haml '%h1= @ticket.slug'
end

и варианты отображаются отлично, поэтому часть проблемы может быть неправильной, если запросить DM

0 голосов
/ 19 августа 2010

Изменено

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

до

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

и все работает

...