0

私は Michael Martl による Ruby on Rails チュートリアルに従っていますが、何らかの理由で UI/ページからデータベース (sqlite3) にユーザーを追加できません。パラメーターはエラーなしで渡され、サーバー ログにパラメーターが表示されますが、データはそのまま DB に到達しません。

Started POST "/users" for 192.168.1.100 at 2013-03-05 01:20:39 -0500
Processing by UsersController#create as HTML
  Parameters: {"utf8"=>"\u2713", "authenticity_token"=>"7VZ7HobCW9YrVBf/LadINF35c9ZThTYb2vBsA+02180=", "user"=>{"name"=>"smith", "email"=>"smith@dev.com"}, "commit"=>"Create my account"}
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
  Rendered shared/_error_messages.html.erb (4.1ms)
  Rendered users/new.html.erb within layouts/application (7.1ms)
  Rendered layouts/_shim.html.erb (0.0ms)
  Rendered layouts/_header.html.erb (0.7ms)
  Rendered layouts/_footer.html.erb (0.8ms)
#<ActiveModel::Errors:0xa8e2934 @base=#<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>, @messages={:name=>["can't be blank"], :email=>["can't be blank"]}>
Completed 200 OK in 89ms (Views: 77.4ms | ActiveRecord: 0.8ms)

Rails コンソールから DB に同じパラメーターを渡すと、正常に動作します。ユーザーは問題なく追加/保存されます。データが失われるのは UI からのみです。

これが私のスキーマ情報とユーザー モデル ファイルです。

# == Schema Information
#
# Table name: users
#
#  id         :integer          not null, primary key
#  name       :string(255)
#  email      :string(255)
#  created_at :datetime         not null
#  updated_at :datetime         not null
#



   class User < ActiveRecord::Base
      attr_accessible :name, :email
      #has_many :microposts
      before_save { email.downcase! }

      validates :name, presence: true
      validates :email, presence: true
    end

私のコントローラー:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def show
    @user = User.find(params[:id])
  end

  def create
    @user = User.new(params[:id])
    if @user.save
      redirect_to @user
    else
      render 'new'
      Rails.logger.info(@user.errors.inspect) 
    end
  end
end

私はこのコードをしばらく見つめていましたが、助けていただければ幸いです!

4

1 に答える 1

1

何よりもまず、検証はモデルの最初のステートメントにする必要があります。それらをbefore_saveコールバックの後に配置すると、値がデータベースに保存された後に実行されるため、それらを記述しても意味がありません。

したがって、最初に次のことを行います-

class User < ActiveRecord::Base
  attr_accessible :name, :email

  validates :name, presence: true
  validates :email, presence: true

  before_save { email.downcase! }
end

第二に、

作成アクションはparams[:user]渡す必要があり、 ではありませんparams[:id]

これを行う-

def create
  @user = User.new(params[:user])

  if @user.save
    redirect_to @user
  else
    render 'new'
    Rails.logger.info(@user.errors.inspect) 
  end
end

次に、アプリケーションを実行して確認します。データベースに新しいユーザーを取得したことがわかります。

于 2013-03-05T07:10:12.300 に答える