2013-03-05 11 views
0

我跟随Michael Martl的Ruby on Rails教程,无论出于何种原因我无法添加用户从UI /页面到数据库(sqlite3)。这些参数传递没有错误,我看在服务器日志的参数,但该数据未达到DB完好:在Rails中发布的参数没有到达ActiveModel,无法从UI发布数据到SQLite,但它可以从Rails控制台运行

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"=>"[email protected]"}, "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控制台,它工作正常;用户被添加/保存没有问题。只有在用户界面上才会丢失数据。

这里是我的架构信息和用户模型文件:

# == 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 

我在此代码为现在而一直盯着,任何帮助,将不胜感激!

回答

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 

现在,运行应用程序和检查。你会看到你的数据库中有新用户。

+0

感谢您的快速响应!这工作。我想知道为什么rails tutorial示例代码在验证之前具有before_save方法? https://github.com/railstutorial/sample_app_2nd_ed/blob/master/app/models/user.rb – jsutton 2013-03-06 00:25:47

相关问题