0

我正在关注 Micheal Hartl 的 Ruby on Rails 教程书。我正在验证 sample_app 中是否存在名称和电子邮件。在 rails 控制台中,我正在运行

user = User.new(:email => "user@example.com")

测试一个缺席的名称值,但我得到了回报;

attr_accessible is extracted out of Rails into a gem.
Please use new recommended protection model for params(strong_parameters)
or add 'protected_attributes' to your Gemfile.

我的 user.rb 是,

class User < ActiveRecord::Base

attr_accessible :name, :email

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

因为我不确定如何使用 strong_parameters 我将 protected_attributes 添加到我的 Gemfile 中,就像这样,

source 'https://rubygems.org'

gem 'protected_attributes'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.2'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0'

gem 'uglifier', '>= 1.3.0'


gem 'coffee-rails', '~> 4.0.0'


 gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.2'

group :doc do
 # bundle exec rake doc:rails generates the API under doc/api.
 gem 'sdoc', require: false
end
group :test do
gem 'rspec'
end

group :development do
gem 'rspec-rails'
end


# Use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.1.2'

# Use unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano', group: :development

# Use debugger
# gem 'debugger', group: [:development, :test]

我怎样才能让我的验证工作?

4

3 回答 3

3

Micheal Hartl 的 Ruby on Rails 教程书使用的是 rails3 版本。但是您所做的项目是在 rails4 中。

Rails4 使用强参数。如果您想使用 rails3 语法,请添加“protected_attributes”gem 并进行捆绑安装。我的建议是使用 rails4 的新语法。不要在用户模型中使用 attr_accessible,而是在 users_controller 中创建一个私有方法。

private

def user_params
  params.require(:user).permit(:name, :email)
end
于 2014-03-30T12:30:12.210 回答
1

在 Rails 4 中,您需要 attr_accessible :name, :email从 User 模型中删除。

相反,您需要在用户控制器中有强大的参数:

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end

查看用于用户控制器用户模型的 Rails 教程(Rails 版本 4)代码示例

有关强参数的更多信息

于 2014-03-30T12:26:57.107 回答
0

这里的其他两个答案是您所需要的,但要添加一些关于的信息strong_params,我想概述为什么要使用它们:

它提供了一个用于保护属性免受最终用户分配的接口。这使得 Action Controller 参数在被列入白名单之前禁止在 Active Model 质量分配中使用

质量分配(如此处所述)不好,因为它只是意味着您可以将任何参数发送到您的控制器,并且它将在没有任何事先验证的情况下将该数据与模型一起使用(可能允许您编辑系统上的任何数据)

为了解决这个问题,Rails 3 引入attr_accessible了确保只有某些参数被传递给 db。然而,为了使这更加安全,Rails 4 采用strong_params在控制器级别分配参数

本质上,您必须将您的替换attr_accessible为:

#app/controllers/users_controller.rb
def new
    @user = User.new #-> creates new ActiveRecord object
end

def create
    @user = User.new(user_params)
end

private

def user_params
    params.require(:user).permit(:your, :params)
end

PS 也会protected_attributes从您的 GemFile 中删除 - 您将收到批量分配错误 :)

于 2014-03-30T13:58:35.403 回答