2011-07-01 57 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

它看起来像你已经拥有了它。你在这里定义的Post和Comment之间有一对多的关系。你还在做什么? –

回答

1

如果我理解你的问题,你已经最需要的一切。你post.erb文件可能看起来像:

<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形式指向你的/意见的权利领域/创建路线。

我在那里使用“Delete”按钮的原因是因为你的“delete'/ comment /:id'”将会寻找HTTP DELETE方法。不幸的是,浏览器实际上并没有实现它。在POST表单中寻找“_method”字段是Sinatra/Rails/Rack应用程序如何解决这个问题。然后,您附近的西纳特拉应用程序顶部,你必须告诉它寻找一个“_method”字段:

use Rack::MethodOverride 

希望这是你在问什么。

+0

这正是我在寻找的非常感谢。 – BimoZX

相关问题