2016-08-05 9 views
0

これまで、多言語で長年の経験を持つ経験豊富な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、と説明を持っています。なぜ "著者は存在しなければならない、タイトルは空白にできない"

+1

Ok '@ book.save'を' @ book.save! 'に置き換えると、そこにエラーが表示されます。これが最初のデバッグツールになります。あなたが見ていることを私に教えてください、私はあなたを助けます。私はあなたが本を作るのに困っていると思っていましたか?私の前提に間違っていたら私を修正してください。 –

答えて

0

books/newビューでform_tagの代わりにform_forを使用してみてください。これはモデルオブジェクトのフォームを作成するRailsの方法です。

form_for hereで便利なガイドを確認してください。

+0

これを試したところ、 "定義されていないメソッド名がハッシュのために作成される"というエラーが発生しました –

+0

form_forを使用する新しいビューで質問を編集できますか? – davideghz

0

どのようにデバッグする....

Railsアプリケーションをデバッグするためのツールがいくつかあります。すでに発見したログファイル:log/development.log

もう1つはByebugです。あなたのGemfileに宝石を追加し、 'else'の後に作成アクションに以下を挿入してください:

require 'byebug' 
byebug 

次にフォームを再度投稿してください。開発サーバーは、ローカル変数、インスタンス変数、およびスタックトレースを検査できるByebugコンソールを起動します。

@book.errors 

ActiveRecordモデルが保存に失敗した場合は、通常、検証が失敗したためです。保存時に発生したエラーは、モデルインスタンスのerrorsオブジェクトに追加されます。

エラーの原因は、フォームが予想されるパラメータを渡していないためです。規約によると、モデルの属性がモデル名であるので、params[:book][:title]ではなく、params[:titleであるモデルの属性がハッシュになると予想されます。詳細については、form_forヘルパーのドキュメントを参照してください。

+0

私は '!'を追加しました。 @のbooks.saveへとなった: ... BooksController番号による処理は、HTML パラメータとして作成します:{ "UTF8" => "✓"、 "authenticity_token" => "qvgB2E2d9Wvs7bdkfp9lCKtTazEaJleZO3VAOIXQANHeEUWT25RqvKXz36H7u/UC78 + HaW4Kd0KYE8xQPHwrRA =="、「ブック"=" {title "=>" Book2 "、" description "=>" A Book "}、" book "=> {" author_id "=>" 2 "}" commit "=>" Create "} はActiveRecord :: RecordInvalid(検証は失敗しました:著者が存在している必要があります): アプリ/コントローラ/ books_controller.rb:(0.1ms)は、トランザクション (0.1ms)が4msの(0.1msのActiveRecord)で422処理不能エンティティを完了したトランザクション をロールバックを開始します:19: 'create ' –

+0

「著者は存在しなければならない」という検証のために失敗します。 author_idは、保存時にブックに設定されません。モデルに 'accepts_nested_attributes_for'が含まれていますか? Railsガイドhttp://guides.rubyonrails.org/form_helpers.html、セクション9.1を参照してください。 – zetetic

+0

いいえ、私はそれを調べます。私が従っていたチュートリアルにはそれがなかった。 –

0

ありがとうございました。あなたの提案とさまざまな準備ができているさまざまなGoogleサイトからの推測で、それらを組み合わせてnew.html.erb put form_for(@book)に入れ、次にbooks_controller.rbの作成メソッドで@book - Bookを作成しました。私は、これはRailsの4、最大で必要とされる強力な帰属を処理するためであることを推測している

def book_params 
     params.require(:book).permit(:title, :author_id, :description) 
    end 

:book_paramsは新しい(book_params)、。最初の議論として本があり、それが存在してから本がいっぱいになる前に、私は奇妙な誤りがありました。 @bookを引数としてform_forを使用した後、フォームの値をブックハッシュに設定します。 params.require with:bookを最初の引数として、そのハッシュを調べてtitle、author_id、およびdescriptionを抽出します。

また、多くのおかげさまで、バイバイのことを学び、保存しました。等々。私は情報が非常に概略であり、バージョンが言及されていないことがわかっているので、何度も何度も迷惑をかける。

関連する問題