Rails + Mongoid + 强参数失败
Rails + Mongoid + Strong Parms failure
所以,我对 ruby 和 rails 比较陌生。我正在为我的数据库玩弄 mongoid,尽管我所掌握的唯一知识是使用活动记录。
我创建了一个新项目,确保跳过活动记录,这样我以后就不必执行删除它的步骤以支持 mongoid。
我创建了一个脚手架 rails g scaffold user
并继续环顾四周。所以因为我知道 mongo 是一个无模式的数据库,所以我去了模型并像这样修改它:
class User
include Mongoid::Document
include Mongoid::Timestamps
field :name, :type => String
end
很简单,只有一个字段(暂时)。因此,我通过正常路径 <%= text_field_tag :name %>
将该字段添加到我的表单并重新启动了我的服务器 rails s
我去了开发站点,一切似乎都在正常工作。所以,我提交了表格,它也提交了。查看数据库,仅创建一个没有名称字段的文档。记得关于活动记录的 strong attributes
,我去了 users_controller.rb
并像这样修改它:
def user_params
params.require(:user).permit(:name)
end
在这一点上,不记得我是否需要重新启动服务器——我需要,只是为了安全起见。一旦服务器 运行 我去网站,提交表格,它告诉我:
param is missing or the value is empty: user
不确定我在这里做错了什么,或者如果使用 mongoid 我什至需要 .require 行(老实说我不知道它做了什么,除了我认为它需要permit 中的这些字段正在提交给用户模型)作为删除 .require 部分,只是 params.permit(:name)
按原样处理信息。
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
$ rails --version
Rails 4.2.1
和我的 GemFile:
source 'https://rubygems.org'
gem 'rails', '4.2.1'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'mongoid', '~> 4.0.0'
# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'
#gem 'rspec-its'
# Use Unicorn as the app server
#gem 'unicorn'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
#gem 'font-awesome-rails', '~> 4.3.0.0'
#gem 'foundation-rails'
group :development, :test do
gem 'rspec-rails', '~> 3.2.1'
gem 'byebug'
gem 'web-console', '~> 2.0'
gem 'spring'
gem 'factory_girl_rails', '~> 4.5.0'
end
group :development do
gem 'quiet_assets', '~> 1.1.0'
end
group :test do
gem 'capybara', '~> 2.4.4'
gem 'capybara-email', '~> 2.4.0'
gem 'shoulda-matchers', '~> 2.8.0'
end
你知道我做错了什么吗?只有与此相关的代码是由 rails new
和 rails g
生成的
首先,对于您所描述的任何更改,您不需要重新启动 rails 服务器。
您得到的错误只是意味着 params[:user]
为空(或缺失)。如果您检查 development.log,您会看到设置的是 params[:name]
。
这是因为您使用了 text_field_tag
,它没有命名输入以便将值嵌套在 params[:user] 中。
假设您正在使用 form_for
创建表单,您想要改为
f.text_field :name
所以,我对 ruby 和 rails 比较陌生。我正在为我的数据库玩弄 mongoid,尽管我所掌握的唯一知识是使用活动记录。
我创建了一个新项目,确保跳过活动记录,这样我以后就不必执行删除它的步骤以支持 mongoid。
我创建了一个脚手架 rails g scaffold user
并继续环顾四周。所以因为我知道 mongo 是一个无模式的数据库,所以我去了模型并像这样修改它:
class User
include Mongoid::Document
include Mongoid::Timestamps
field :name, :type => String
end
很简单,只有一个字段(暂时)。因此,我通过正常路径 <%= text_field_tag :name %>
将该字段添加到我的表单并重新启动了我的服务器 rails s
我去了开发站点,一切似乎都在正常工作。所以,我提交了表格,它也提交了。查看数据库,仅创建一个没有名称字段的文档。记得关于活动记录的 strong attributes
,我去了 users_controller.rb
并像这样修改它:
def user_params
params.require(:user).permit(:name)
end
在这一点上,不记得我是否需要重新启动服务器——我需要,只是为了安全起见。一旦服务器 运行 我去网站,提交表格,它告诉我:
param is missing or the value is empty: user
不确定我在这里做错了什么,或者如果使用 mongoid 我什至需要 .require 行(老实说我不知道它做了什么,除了我认为它需要permit 中的这些字段正在提交给用户模型)作为删除 .require 部分,只是 params.permit(:name)
按原样处理信息。
$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
$ rails --version
Rails 4.2.1
和我的 GemFile:
source 'https://rubygems.org'
gem 'rails', '4.2.1'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'mongoid', '~> 4.0.0'
# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'
#gem 'rspec-its'
# Use Unicorn as the app server
#gem 'unicorn'
# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development
#gem 'font-awesome-rails', '~> 4.3.0.0'
#gem 'foundation-rails'
group :development, :test do
gem 'rspec-rails', '~> 3.2.1'
gem 'byebug'
gem 'web-console', '~> 2.0'
gem 'spring'
gem 'factory_girl_rails', '~> 4.5.0'
end
group :development do
gem 'quiet_assets', '~> 1.1.0'
end
group :test do
gem 'capybara', '~> 2.4.4'
gem 'capybara-email', '~> 2.4.0'
gem 'shoulda-matchers', '~> 2.8.0'
end
你知道我做错了什么吗?只有与此相关的代码是由 rails new
和 rails g
首先,对于您所描述的任何更改,您不需要重新启动 rails 服务器。
您得到的错误只是意味着 params[:user]
为空(或缺失)。如果您检查 development.log,您会看到设置的是 params[:name]
。
这是因为您使用了 text_field_tag
,它没有命名输入以便将值嵌套在 params[:user] 中。
假设您正在使用 form_for
创建表单,您想要改为
f.text_field :name