0

所以,我对 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 行(老实说我不知道​​它做了什么,除非我认为它要求将这些字段提交给user model ) 删除 .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 newand生成的rails g

4

1 回答 1

1

首先,您不需要为您描述的任何更改重新启动 rails 服务器。

你得到的错误只是意味着它params[:user]是空的(或丢失)。如果你检查你的 development.log 你会看到它params[:name]被设置了。

这是因为您使用text_field_tag了 ,它没有命名输入以便将值嵌套在 params[:user] 中。

假设您正在使用form_for创建表单,您想要改为

f.text_field :name
于 2015-04-25T21:20:33.783 回答