これまで、多言語で長年の経験を持つ経験豊富なJava EE開発者にとって、Ruby on Railsには本当に困難があります。私は使用しています:ruby 2.3.1p112(2016-04-26リビジョン54768)[x86_64-darwin15]とRails 5.0.0。私はプライベートライブラリWebアプリケーションを構築する非常に簡単なオンラインチュートリアルに従っていますが、何かを学ぶために、リンクされた科目表を持つ本を持つ代わりに、多くの本が同じ著者を持つので科目を著者に変更しました。私はSQLLiteを開発用にMySQLをプロダクション用に使用しています(まだ入手していません!)。私はほとんどのチュートリアルの指示に正確に従うと、あなたが構築していたアプリケーションがあれば終わります。しかし、あなたが何らかの方法で逸脱した場合、物事はうまく機能せず、何が起こったのか把握するのは非常に難しいです。未定義の変数や定数がある場合、ログにエラーメッセージ(時には)が表示されます。通常は、その変数が使用されている場所を検索し、それを定義したり、正しく入力するようにします。しかし、RoRでは、その定数はログ内以外には表示されません。 RoRは、その規約のために、あなたがそのような変数を持っていたと仮定して作成したか、または仮定しています。実際には、複数形ではなく単数形の "view"それを指す変数を "発明"しましたが、パターンと一致しませんでした。したがって、エラーメッセージが非常に貧弱です。シンプルなRoRアプリケーションをデバッグする方法
サーバーは不平を言っておらず、ロールバックしています。上記のように、ログには何らかの意味のないメッセージがあります。私は、人々が提案したルートや、名前を変更するルートに対してさまざまなパターンを試してみることに時間を費やしますが、それはすべて推測です。
私はそれらを理解しているフレームワークとシステムでの作業を楽しんでいます。これは、yml、yaml、erb、rb、sass、hamlなどで解析するさまざまな部分のコレクションであると思われます。私はロギングを試しましたが、無駄です。単純な間違いをどのように見つけましたか?あるアプリ/ビュー/ブック下
class BooksController < ApplicationController
def list
@books = Book.all
end
def show
@book = Book.find(params[:id])
end
def new
@book = Book.new
@authors = Author.all
end
def create
@book = Book.new(book_params)
if @book.save
logger.debug 'Redirecting to list'
redirect_to :action => 'list'
else
@authors = Author.all
render :action => 'new'
end
end
def edit
@book = Book.find(params[:id])
@authors = Author.all
end
def update
@book = Book.find(params[:id])
if @book.update_attributes(book_params)
redirect_to :action => 'show', :id => @book
else
@authors = Author.all
render :action => 'edit'
end
end
def delete
Book.find(params[:id]).destroy
redirect_to :action => 'list'
end
def show_authors
@author = Author.find(params[:id])
end
def book_params
params.require(:books).permit(:title, :description, :author_id)
end
end
new.html.erb:
<h1>Add new book</h1>
<%= form_tag :action => 'create' do %>
<p><label for = "book_title">Title</label>:
<%= text_field 'books', 'title' %></p>
<p><label for = "book_author_id">Author</label>:
<%= collection_select(:book, :author_id, @authors, :id, :name, prompt: true) %></p>
<p><label for = "book_description">Description</label><br/>
<%= text_area 'books', 'description' %></p>
<%= submit_tag "Create" %>
<% end -%>
<%= link_to 'Back', {:action => 'list'} %>
routes.rbをです:
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
resources :books
#get 'books/list'
#post 'books/create'
#get 'books/new'
#patch 'books/update'
#get 'books/show'
#get 'books/edit'
#get 'books/delete'
get 'books/show_authors'
get 'authors/list'
post 'authors/create'
get 'authors/new'
patch 'authors/update'
get 'authors/show'
get 'authors/edit'
root :to => 'books#list'
end
はここに私の "books_controller.rb" であります
新しい本を追加しようとすると、タイトルを入力して著者を選択し、説明を入力して[作成]をクリックします。その後、新しい画面に戻ります。
Started GET "/books/new" for ::1 at 2016-08-04 17:18:22 -0400
Processing by BooksController#new as HTML
Rendering books/new.html.erb within layouts/application
Author Load (0.1ms) SELECT "authors".* FROM "authors"
Rendered books/new.html.erb within layouts/application (5.4ms)
Completed 200 OK in 26ms (Views: 21.6ms | ActiveRecord: 0.5ms)
Started POST "/books" for ::1 at 2016-08-04 17:18:28 -0400
Processing by BooksController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"noRmEq8rHE6RLs0cPNrlZoQXq//2sr+SAOSHEFc0U3zqbSJZOSKDmdgwpdm5/nVswItHp4Ken0mjggt47ph46Q==", "books"=>{"title"=>"sdfasdf", "description"=>"asdfasdf"}, "book"=>{"author_id"=>"2"}, "commit"=>"Create"}
(0.1ms) begin transaction
(0.1ms) rollback transaction
Rendering books/new.html.erb within layouts/application
Author Load (0.1ms) SELECT "authors".* FROM "authors"
Rendered books/new.html.erb within layouts/application (2.0ms)
Completed 200 OK in 24ms (Views: 20.3ms | ActiveRecord: 0.2ms)
開発ログがあります:コンソールがあり
Started GET "/books/new" for ::1 at 2016-08-04 17:18:22 -0400
Processing by BooksController#new as HTML
Rendering books/new.html.erb within layouts/application
[1m[36mAuthor Load (0.1ms)[0m [1m[34mSELECT "authors".* FROM "authors"[0m
Rendered books/new.html.erb within layouts/application (5.4ms)
Completed 200 OK in 26ms (Views: 21.6ms | ActiveRecord: 0.5ms)
Started POST "/books" for ::1 at 2016-08-04 17:18:28 -0400
Processing by BooksController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"noRmEq8rHE6RLs0cPNrlZoQXq//2sr+SAOSHEFc0U3zqbSJZOSKDmdgwpdm5/nVswItHp4Ken0mjggt47ph46Q==", "books"=>{"title"=>"sdfasdf", "description"=>"asdfasdf"}, "book"=>{"author_id"=>"2"}, "commit"=>"Create"}
[1m[35m (0.1ms)[0m [1m[36mbegin transaction[0m
[1m[35m (0.1ms)[0m [1m[31mrollback transaction[0m
Rendering books/new.html.erb within layouts/application
[1m[36mAuthor Load (0.1ms)[0m [1m[34mSELECT "authors".* FROM "authors"[0m
Rendered books/new.html.erb within layouts/application (2.0ms)
Completed 200 OK in 24ms (Views: 20.3ms | ActiveRecord: 0.2ms)
はい、トランザクションはロールバックされました。どうして?データベースを "ロールバック"させた原因に関する情報を入手するにはどうすればよいですか?データベース内の2つのテーブルがあります:私は入力を感謝し、特に実際に起こっなぜ起こったか何を理解することに役立つだろう
b=Book.create :title=>'Test', :author_id=>1, :description=>'Desc'
(0.1ms) begin transaction
Author Load (0.1ms) SELECT "authors".* FROM "authors" WHERE "authors"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
SQL (0.3ms) INSERT INTO "books" ("title", "author_id", "description", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["title", "Test"], ["author_id", 1], ["description", "Desc"], ["created_at", 2016-08-04 20:17:40 UTC], ["updated_at", 2016-08-04 20:17:40 UTC]]
(2.4ms) commit transaction
=> #<Book id: 1, title: "Test", author_id: 1, description: "Desc", created: nil, created_at: "2016-08-04 20:17:40", updated_at: "2016-08-04 20:17:40">
:
class CreateBooks < ActiveRecord::Migration[5.0]
def change
create_table :books do |t|
t.string :title
t.integer :author_id
t.string :description
t.timestamp :created
t.timestamps
end
end
end
class CreateAuthors < ActiveRecord::Migration[5.0]
def change
create_table :authors do |t|
t.string :name
t.timestamps
end
end
end
class Book < ApplicationRecord
belongs_to :author
validates_presence_of :title
end
class Author < ApplicationRecord
has_many :books
end
私はとレールコンソールでブックを作成することができます。非常に単純なエラーが出ているようですが、私はそれを見ることはできません。
------------------いくつかの回答と「推測」の後に追加されました。 以下に示すように、form_tagをform_forに変更しました。 ---- new.html。ERBは------私は、ブラウザで取得
<%= form_for(@book) do |f| %>
Title: <%= f.text_field :title %><br/>
Author: <%= select("book", "author_id", Author.all.collect{|p| [p.name,p.id]}, prompt: 'Select') %><br/>
Description: <%= f.text_area :description %><br/>
<%= f.submit "Create" %>
<% end -%>
<%= link_to 'Back', {:action => 'list'} %>
:
Validation failed: Author must exist, Title can't be blank
Extracted source (around line #18):
16
17
18
19
20
21
def create
@book = Book.new
if @book.save!
redirect_to :action => 'list'
else
@authors = Author.all
Rails.root: /Users/woo/Development/rails/library
Application Trace | Framework Trace | Full Trace
app/controllers/books_controller.rb:18:in `create'
Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"gi+wVGV3MIlkJsRjO8Ig1cS3YV/OIADSevFJg7ItBesokIiHFDThycTO8/kob+2E1fuPFquFUK+b7bGksWRZGQ==",
"book"=>{"title"=>"Book", "author_id"=>"2", "description"=>"test"},
"commit"=>"Create"}
私の知る限り見ることができるように、この本は、タイトル、およびAUTHOR_ID、と説明を持っています。なぜ "著者は存在しなければならない、タイトルは空白にできない"
Ok '@ book.save'を' @ book.save! 'に置き換えると、そこにエラーが表示されます。これが最初のデバッグツールになります。あなたが見ていることを私に教えてください、私はあなたを助けます。私はあなたが本を作るのに困っていると思っていましたか?私の前提に間違っていたら私を修正してください。 –