0

我正在关注 Michael Martl 的 Ruby on Rails 教程,无论出于何种原因,我都无法从 UI/页面将用户添加到数据库 (sqlite3)。参数传递没有错误,我在服务器日志中看到参数,但数据没有完整地到达数据库:

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 控制台将相同的参数传递给数据库时,它工作正常;用户被添加/保存没有问题。数据仅在 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

您的 create 操作应该必须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 回答