我想在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!
现在,我的问题是如何设置注释的实例变量 在帖子显示文件中,制作,删除和显示评论。
欢迎任何建议和解决方案。
答案 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
希望这就是你所要求的。