Sinatra和DataMapper Association

时间:2011-07-01 06:22:22

标签: ruby sinatra datamapper

我想在Sinatra和DataMapper中创建一个博客应用程序,我的主应用程序文件是这样的。

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

现在,我的问题是如何设置注释的实例变量 在帖子显示文件中,制作,删除和显示评论。

欢迎任何建议和解决方案。

1 个答案:

答案 0 :(得分: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表单,其中包含指向/ comments / create路径的正确字段。

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

use Rack::MethodOverride

希望这就是你所要求的。