2011-07-01 14 views
2

SinatraとDataMapperでブログアプリケーションを作成したいのですが、私の主なアプリケーションファイルはこのようなものです。Sinatraと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! 

さて、私の問題は、作成、削除、コメントを表示するには、ポストショーファイルのコメント のインスタンス変数を設定する方法です。

いずれの提案や解決策も歓迎されます。

+0

お望みのものについてもう少し明確にしてください。 –

+0

基本的には、ブログのように私のアプリでは基本的な投稿をコメントの関係にしたい。 – BimoZX

+0

あなたはすでにそれを持っているように私に見えます。投稿とコメントの間には1対1の関係があります。それ以外に何がありますか? –

答えて

1

私があなたの質問を理解すれば、あなたはあなたが必要とするほとんどのものをすでに手に入れています。単にルートを作成/あなた/コメントを指す右のフィールドを持つPOSTフォームを追加し、新しいコメントを作成するには

<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 %> 

:あなたのpost.erbファイルには、のようになります。

"削除 '/コメント/:id'"がHTTP DELETEメソッドを探しているため、私はそのフォームに "削除"ボタンがある理由があります。残念ながら、ブラウザは実際にはそれを実装していません。 POSTフォームで "_ method"フィールドを探しているのは、Sinatra/Rails/Rackアプリケーションがその周りをどのように捉えているかです。うまくいけば、それはあなたが求めていたものだ

use Rack::MethodOverride 

:次に、あなたのシナトラアプリの上部付近に、あなたがその「_method」フィールドを探すために、それを伝える必要があります。

+0

これはまさに私が感謝のためにたくさん探しているものです。 – BimoZX