开发者

Sinatra and DataMapper Association

I want to make a blog application in Sinatra and DataMapper, my main application file is like this.

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

DataMapper.setup(:default , ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/de开发者_如何学运维velopment.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!

Now, my problem is how to set up the instance variable of comments in the post show file, to make, delete, and show the comments.

Any suggestion and solutions would be welcomed.


If I understand your question, you already most everything you need. Your post.erb file could look something like:

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

To create new comments, simply add a POST form with the right fields that points to your /comments/create route.

The reason I have that form with the "Delete" button in there is because your "delete '/comment/:id'" will be looking for the HTTP DELETE method. Unfortunately browsers don't actually implement that. Looking for a "_method" field in a POST form is how Sinatra/Rails/Rack apps get around that. Then, near the top of your Sinatra app, you have to tell it to look for that "_method" field with:

use Rack::MethodOverride

Hopefully that's what you were asking.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜