1

だから、私は Ruby/Sinatra の初心者で、たくさんのコードアカデミーのレッスンなどを行いました。実際に何かを構築するまでは、いくつかのコア コンセプトを本当に理解できないと判断しました。

Sinatra で To Do リスト アプリを作成するためのチュートリアルを見つけましたが、編集と削除の機能にたどり着くまでは、すべてうまくいきました。データベースへの読み書きはできますが、編集または削除しようとすると、「メモが見つかりません」にスキップします。

私はこれを自分で理解できなかったので、開発者の友人に尋ねました。私が彼にコードを送ったとき、すべてが彼にとって完全にうまくいきました! 考えられるいくつかの修正を試みましたが、終わりがありませんでした。自分のコードのどこかにランダムな間違いがあった場合に備えて、男のgithubからコードをダウンロードしましたが、役に立ちませんでした。

だから、私は助けを求めてここに来ました!なぜこれがうまくいかないのですか!

明確化: ここに問題があると思われるコードの一部を示します。edit.erb と delete.erb では、else ステートメントに何をしようとしても、「note not found」というメッセージが表示されます。私のホームページはメモを追加して表示できるので、データベースから適切に読み取っています。

リコール.rb

get '/:id' do
    @note = Note.get params[:id]
    @title = "Edit note ##{params[:id]}"
    erb :edit
end

put '/:id' do
    n = Note.get params[:id]
n.content = params[:content]
n.complete = params[:complete] ? 1 : 0
n.updated_at = Time.now
n.save
redirect '/'
end

get '/:id/delete' do
    @note = Note.get params[:id]
    @title = "Confirm deletion of note ##{params[:id]}"
    erb :delete
end

delete '/:id' do
    n = Note.get params[:id]
    n.destroy!
    redirect '/'
end

edit.erb

<% if @note %>
  <form action="/<%= @note.id %>" method="post" id="edit">
    <input type="hidden" name="_method" value="put">
    <textarea name="content"><%= @note.content %></textarea>
    <input type="checkbox" name="complete" <%= "checked" if @note.complete %>>
    <input type="submit">
  </form>
  <p><a href="/<%= @note.id %>/delete">Delete</a></p>
<% else %>
  <p>Note not found.</p>
<% end %>

削除.erb

<% if @note %>
  <p>Are you sure you want to delete the following note: <em>"<%= @note.content %>"</em>?</p>
  <form action="/<%= @note.id %>" method="post">
    <input type="hidden" name="_method" value="delete">
    <input type="submit" value="Yes, Delete It!">
    <a href="/<%= @note.id %>">Cancel</a>
  </form>
<% else %>
  <p>Note not found.</p>
<% end %>
4

2 に答える 2

0

これがまだ面白い人かどうかはわかりませんが、簡単です

params[:id].to_i

私のためにそれを修正しました。

于 2014-04-29T19:44:45.100 に答える
0

削除ルートを他のルートの上に移動すると、私にとってはうまくいくように見えました。これは/:id、ルート定義の-part が/delete-part もキャッチすることを示唆しています。で生成された正規表現を見ることができますSinatra::Application.routes

ここに最小限のものがあります:

require 'rubygems'
require 'sinatra'
require 'dm-core'
require 'dm-migrations'
require 'dm-sweatshop'

# Models
DataMapper.setup(:default, 'sqlite::memory:')

class Note
  include DataMapper::Resource
  property :id, Serial
  property :content, Text, :required => true
  property :complete, Boolean, :default => false
  property :created_at, DateTime, :default => lambda {Time.now}
  property :updated_at, DateTime

  before(:save) { attribute_set(:updated_at, Time.now) }
end

DataMapper.finalize.auto_migrate!

# Fixtures
Note.fix {{
  :content => /\w+/.gen
}}

100.of { Note.gen }

# Routes
before("/:id") {|id| @note = Note.get id }

get("/:id/delete") {|id| @note = Note.get id; erb :delete }

get("/:id") { erb :edit }

put "/:id" do
  @note.attributes = params["note"]
  @note.save ? redirect(to("/")) : erb(:edit)
end

delete("/:id") { @note.destroy; redirect(to("/")) }

# Templates
template :layout do
  '<!DOCTYPE html>
  <html>
    <body><%= yield %></body>
  </html>'
end

template :edit do
  '<% if @note %>
    <form action="/<%= @note.id %>" method="POST">
      <input type="hidden" name="_method" value="PUT">
      <textarea name="note[content]"><%= @note.content %></textarea>
      <input type="checkbox" name="note[complete]"
        <%= @note.complete? && "checked" %> >
      <input type="submit">
    </form>
    <p><a href="/<%= @note.id %>/delete">Delete</a></p>
  <% else %>
    <p>Note not found.</p>
  <% end %>'
end

template :delete do
  '<% if @note %>
    <p>Are you sure you want to delete the following note:
      <em>"<%= @note.content %>"</em>?</p>
    <form action="/<%= @note.id %>" method="POST">
      <input type="hidden" name="_method" value="DELETE">
      <input type="submit" value="Yes, Delete it!">
      <a href="/<%= @note.id %>">Cancel</a>
    </form>
  <% else %>
    <p>Note not found</p>
  <% end %>'
end
于 2013-04-22T16:30:10.103 に答える