【问题标题】:Sinatra and DataMapper AssociationSinatra 和 DataMapper 协会
【发布时间】:2011-07-01 06:22:22
【问题描述】:

我想在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!

现在,我的问题是如何设置 cmets 的实例变量 在 post show 文件中,创建、删除和显示 cmets。

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

【问题讨论】:

  • 您能否给我们进一步说明一下您想要什么?
  • 基本上我想要一个基本的帖子来评论我的应用程序中的关系,就像博客一样。
  • 在我看来您已经掌握了它。您在此处定义了 Post 和 Comment 之间的一对多关系。你还追求什么?
  • 我实际上是在视图中的实例变量之后。所以我不能以某种方式制作新的 cmets?

标签: ruby sinatra datamapper


【解决方案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 %>

要创建新的 cmets,只需添加一个 POST 表单,其中包含指向 /cmets/create 路由的正确字段。

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

use Rack::MethodOverride

希望这就是你要问的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2015-02-16
    • 1970-01-01
    • 2011-11-23
    • 2014-12-04
    • 2011-01-18
    • 2011-07-14
    相关资源
    最近更新 更多