验证失败 Class 必须存在
Validation failed Class must exist
我在 Rails 的联想方面遇到了(几个小时)麻烦。我发现了很多类似的问题,但是我的case申请不了:
城市class:
class City < ApplicationRecord
has_many :users
end
用户的class:
class User < ApplicationRecord
belongs_to :city
validates :name, presence: true, length: { maximum: 80 }
validates :city_id, presence: true
end
用户控制器:
def create
Rails.logger.debug user_params.inspect
@user = User.new(user_params)
if @user.save!
flash[:success] = "Works!"
redirect_to '/index'
else
render 'new'
end
end
def user_params
params.require(:user).permit(:name, :citys_id)
end
用户查看:
<%= form_for(:user, url: '/user/new') do |f| %>
<%= render 'shared/error_messages' %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :citys_id, "City" %>
<select name="city">
<% @city.all.each do |t| %>
<option value="<%= t.id %>"><%= t.city %></option>
<% end %>
</select>
end
迁移:
class CreateUser < ActiveRecord::Migration[5.0]
def change
create_table :user do |t|
t.string :name, limit: 80, null: false
t.belongs_to :citys, null: false
t.timestamps
end
end
来自控制台和浏览器的消息:
ActiveRecord::RecordInvalid (Validation failed: City must exist):
嗯,问题是,User.save 方法接受来自用户模型的不是 FK 的属性,而像 citys_id 这样的 FK 属性则不是。然后它在浏览器中给我错误消息说 "Validation failed City must exist".
谢谢
尝试以下操作:
belongs_to :city, optional: true
根据 new docs:
4.1.2.11 :optional
If you set the :optional option to true, then the presence of the
associated object won't be validated. By default, this option is set
to false.
我找到了问题的解决方案"Validation failed: Class must exist",它比使用更好:
belongs_to :city, optional: true
4.1.2.11 :optional
If you set the :optional option to true, then the presence of the associated object won't be validated. By default, this option is set to false.
因为您仍然在应用程序级别进行验证。我解决了在创建方法中进行自己的验证并更改 user_params 方法的问题:
def create
@city = City.find(params[:city_id])
Rails.logger.debug user_params.inspect
@user = User.new(user_params)
@user.city_id = @city.id
if @user.save!
flash[:success] = "Works!"
redirect_to '/index'
else
render 'new'
end
end
def user_params
params.require(:user).permit(:name)
end
我没有测试这段代码,但它在我的另一个项目中有效。我希望它可以帮助别人!
belongs_to :city, required: false
这有点晚了,但这是 如何在 rails 中默认关闭此功能 5:
config/initializers/new_framework_defaults.rb
Rails.application.config.active_record.belongs_to_required_by_default = false
如果您不想将 optional: true
添加到所有 belongs_to
。
希望对您有所帮助!
您需要在 belongs_to 关系声明的末尾添加以下内容:
optional: true
可以在全局级别进行设置,使其与旧版本 rails 的工作方式相同,但我建议花时间手动将其添加到真正需要的关系中因为这会减少将来的痛苦。
Rails 5
如果您与 :parent
有 belongs_to
关系,那么您必须传递一个现有的父对象或创建一个新对象,然后分配给子对象。
Rails.application.config.active_record.belongs_to_required_by_default = false
这是有效的,因为 Rails 5 默认为 true
禁用你去 Initilizers 然后点击 New_frame-work 并将 true 变为 false
params.require(:user).permit(:name, :citys_id)
这是一个错误,不是吗? (城市s_id 对比city_id)
我在 Rails 的联想方面遇到了(几个小时)麻烦。我发现了很多类似的问题,但是我的case申请不了:
城市class:
class City < ApplicationRecord
has_many :users
end
用户的class:
class User < ApplicationRecord
belongs_to :city
validates :name, presence: true, length: { maximum: 80 }
validates :city_id, presence: true
end
用户控制器:
def create
Rails.logger.debug user_params.inspect
@user = User.new(user_params)
if @user.save!
flash[:success] = "Works!"
redirect_to '/index'
else
render 'new'
end
end
def user_params
params.require(:user).permit(:name, :citys_id)
end
用户查看:
<%= form_for(:user, url: '/user/new') do |f| %>
<%= render 'shared/error_messages' %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.label :citys_id, "City" %>
<select name="city">
<% @city.all.each do |t| %>
<option value="<%= t.id %>"><%= t.city %></option>
<% end %>
</select>
end
迁移:
class CreateUser < ActiveRecord::Migration[5.0]
def change
create_table :user do |t|
t.string :name, limit: 80, null: false
t.belongs_to :citys, null: false
t.timestamps
end
end
来自控制台和浏览器的消息:
ActiveRecord::RecordInvalid (Validation failed: City must exist):
嗯,问题是,User.save 方法接受来自用户模型的不是 FK 的属性,而像 citys_id 这样的 FK 属性则不是。然后它在浏览器中给我错误消息说 "Validation failed City must exist".
谢谢
尝试以下操作:
belongs_to :city, optional: true
根据 new docs:
4.1.2.11 :optional
If you set the :optional option to true, then the presence of the associated object won't be validated. By default, this option is set to false.
我找到了问题的解决方案"Validation failed: Class must exist",它比使用更好:
belongs_to :city, optional: true
4.1.2.11 :optional
If you set the :optional option to true, then the presence of the associated object won't be validated. By default, this option is set to false.
因为您仍然在应用程序级别进行验证。我解决了在创建方法中进行自己的验证并更改 user_params 方法的问题:
def create
@city = City.find(params[:city_id])
Rails.logger.debug user_params.inspect
@user = User.new(user_params)
@user.city_id = @city.id
if @user.save!
flash[:success] = "Works!"
redirect_to '/index'
else
render 'new'
end
end
def user_params
params.require(:user).permit(:name)
end
我没有测试这段代码,但它在我的另一个项目中有效。我希望它可以帮助别人!
belongs_to :city, required: false
这有点晚了,但这是 如何在 rails 中默认关闭此功能 5:
config/initializers/new_framework_defaults.rb
Rails.application.config.active_record.belongs_to_required_by_default = false
如果您不想将 optional: true
添加到所有 belongs_to
。
希望对您有所帮助!
您需要在 belongs_to 关系声明的末尾添加以下内容:
optional: true
可以在全局级别进行设置,使其与旧版本 rails 的工作方式相同,但我建议花时间手动将其添加到真正需要的关系中因为这会减少将来的痛苦。
Rails 5
如果您与 :parent
有 belongs_to
关系,那么您必须传递一个现有的父对象或创建一个新对象,然后分配给子对象。
Rails.application.config.active_record.belongs_to_required_by_default = false
这是有效的,因为 Rails 5 默认为 true 禁用你去 Initilizers 然后点击 New_frame-work 并将 true 变为 false
params.require(:user).permit(:name, :citys_id)
这是一个错误,不是吗? (城市s_id 对比city_id)