Синатра и Ассоциация DataMapper - PullRequest
2 голосов
/ 01 июля 2011

Я хочу создать приложение для блога в 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 Ответ

1 голос
/ 19 августа 2011

Если я понимаю твой вопрос, тебе уже почти все, что тебе нужно. Ваш файл 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 route.

Причина, по которой у меня есть эта форма с кнопкой «Удалить», заключается в том, что ваш «delete» / comment /: id »будет искать метод HTTP DELETE. К сожалению, браузеры на самом деле не реализуют это. Поиск поля "_method" в форме POST - это то, как приложения Sinatra / Rails / Rack справляются с этим. Затем, в верхней части вашего приложения Sinatra, вы должны указать ему, чтобы искать это поле "_method" с:

use Rack::MethodOverride

Надеюсь, это то, что вы спрашивали.

...