2011-07-01 3 views
2

Je veux faire une application de blog dans Sinatra et DataMapper, mon fichier d'application principal est comme ça.Sinatra et DataMapper Association

%w[rubygems sinatra data_mapper].each{ |r| require r } 

DataMapper.setup(:default , ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/development.db") 

class Post 
    include DataMapper::Resource 

    property :id,  Serial 
    property :title, String 
    property :author, String 
    property :body, Text 

    has n, :comments 
end 

class Comment 
    include DataMapper::Resource 

    property :id,  Serial 
    property :post_id,  Serial 
    property :name, String 
    property :body, Text 

    belongs_to :post 
end 

helpers do 
    def admin? 
    request.cookies[settings.username] == settings.token 
    end 

    def protected! 
    halt [401, 'Not Authorized'] unless admin? 
    end 
end 


post '/comment/create' do 
    comment = Comment.new(:name => params[:name], :body => params[:body]) 
    if comment.save 
    status 201 
    redirect '/post/'+post.id.to_s 
    else 
    status 412 
    redirect '/' 
    end 
end 

get '/post/:id' do 
    @post = Post.get(params[:id]) 
    @comments = Comment.new 
    erb :post 
end 

delete '/comment/:id' do 
    Post.get(params[:id]).Comment.(params[:id]).destroy 
    redirect '/post/'+post.id.to_s 
end 

DataMapper.auto_upgrade! 

Maintenant, mon problème est de savoir comment mettre en place la variable d'instance de commentaires dans le poste fichier show, faire, supprimer et afficher les commentaires.

Toute suggestion et solution seraient les bienvenues.

+0

Pourriez-vous nous donner un peu plus de précisions sur ce que vous voulez, s'il vous plaît? –

+0

Fondamentalement, je veux un poste de base pour commenter relation dans mon application, tout comme un blog. – BimoZX

+0

Il me semble que vous l'avez déjà. Vous avez la relation un à plusieurs entre Post et Comment définie ici. Quoi d'autre est-ce que vous êtes après? –

Répondre

1

Si je comprends votre question, vous avez déjà presque tout ce dont vous avez besoin. Votre fichier post.erb pourrait ressembler à:

<h1><%= @post.title %></h1> 
<%= @post.body %> 

<% @post.comments.each do |comment| %> 
    <p><%= comment.name %><br /><%= comment.body %></p> 

    <form action="/comment/<%= comment.id %>" method="post"> 
    <input type="hidden" name="_method" value="delete" /> 
    <input type="submit" value="Delete comment"> 
    </form> 
<% end %> 

Pour créer de nouveaux commentaires, il suffit d'ajouter un formulaire POST avec les champs de droite que des points à votre/commentaires/créer l'itinéraire.

La raison pour laquelle j'ai ce formulaire avec le bouton "Supprimer" est parce que votre "delete"/comment /: id '"sera à la recherche de la méthode HTTP DELETE. Malheureusement, les navigateurs ne l'implémentent pas. La recherche d'un champ "_method" dans un formulaire POST est la manière dont les applications Sinatra/Rails/Rack s'en sortent. Puis, vers le haut de votre application Sinatra, vous devez dire à la recherche de ce champ « _method » avec:

use Rack::MethodOverride 

Espérons que ce que vous demandez.

+0

C'est exactement ce que je cherche merci beaucoup. – BimoZX

Questions connexes