Ruby on rails Rails嵌套表单不保存子项
我的用户模型有很多反应。我正在尝试创建一个嵌套表单,以创建一个具有三个子响应的新用户。我的代码看起来与Rails cast相同,但尽管它将保存用户,但不会保存他们的响应。有人能看出哪里出了问题吗 用户\u controller.rb 我已将用户模型更新为:Ruby on rails Rails嵌套表单不保存子项,ruby-on-rails,nested-forms,has-many,Ruby On Rails,Nested Forms,Has Many,我的用户模型有很多反应。我正在尝试创建一个嵌套表单,以创建一个具有三个子响应的新用户。我的代码看起来与Rails cast相同,但尽管它将保存用户,但不会保存他们的响应。有人能看出哪里出了问题吗 用户\u controller.rb 我已将用户模型更新为: class User < ActiveRecord::Base has_many :responses, :dependent => :destroy accepts_nested_attributes_for :resp
class User < ActiveRecord::Base
has_many :responses, :dependent => :destroy
accepts_nested_attributes_for :responses#, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
before_save { self.email = email.downcase }
validates :username, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX } ,
uniqueness: {case_sensitive: false};
validates_associated :responses, presence: true
end
class用户:销毁
接受_嵌套的_属性_for:responses#,:reject_if=>lambda{a | a[:content].blank?},:allow_destroy=>true
保存之前{self.email=email.downcase}
验证:用户名,状态:true,长度:{最大值:50}
有效的\u EMAIL\u REGEX=/\A[\w+\-.]+@[A-z\d\-.]+\.[A-z]+\z/i
验证:email,状态:true,格式:{with:VALID\u email\u REGEX},
唯一性:{区分大小写:false};
验证\u关联的:响应,状态:true
结束
现在,它继续使我的响应验证失败,也使我的用户名和电子邮件验证失败。RoR v3的答案: 问题在于
用户
型号中的以下行:
attr_accessor :responses_attributes
替换为:
attr_accessible :responses_attributes
这个问题的答案应该有助于你理解两者之间的区别
此外,您的验证验证:响应,状态:真
需要更新以使用验证\u相关
:
validates_associated :responses, presence: true
RoR v4的答案:
我之前没有注意到强参数的使用,对此表示歉意。有几项更改可以解决您的问题:
用户
模型中删除attr\u访问器:响应属性
验证:响应,状态:真
替换为验证相关:响应,状态:真
响应
属性class User < ActiveRecord::Base
# attr_accessor :responses_attributes # Remove this line
has_many :responses, :dependent => :destroy
accepts_nested_attributes_for :responses#, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
...
validates_associated :responses, presence: true # Update here
end
#Users Controller
class UsersController < ApplicationController
...
private
def user_params
params.require(:user).permit(:username, :email, :responses_attributes[:content])
end
end
class用户:销毁
接受_嵌套的_属性_for:responses#,:reject_if=>lambda{a | a[:content].blank?},:allow_destroy=>true
...
验证_关联:响应、状态:真#此处更新
结束
#用户控制器
类UsersController
您的代码看起来几乎正确:
user.rb
class User < ActiveRecord::Base
has_many :responses, :dependent => :destroy
accepts_nested_attributes_for :responses
before_save { self.email = email.downcase }
validates :username, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX } ,
uniqueness: {case_sensitive: false};
end
private
def user_params
params.require(:user).permit(:username, :email, responses_attributes: [:content])
end
class User < ActiveRecord::Base
attr_accessible :responses_attributes
has_many :responses, :dependent => :destroy, :inverse_of => :user
accepts_nested_attributes_for :responses
# ...
end
class Response < ActiveRecord::Base
belongs_to :user, :inverse_of => :responses
validates_presence_of :user, :content
end
问题出在你的回答课上:
validates_presence_of :user_id, :content
此验证要求存在用户id
,这意味着必须在响应之前创建用户。要使其发挥作用,您可以尝试以下两种方法:
- 将
更改为验证:user\u id的存在
,使其验证验证:user的存在
对象而不是用户iduser
- 使用选项的反向。看
class User < ActiveRecord::Base
has_many :responses, :dependent => :destroy
accepts_nested_attributes_for :responses
before_save { self.email = email.downcase }
validates :username, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX } ,
uniqueness: {case_sensitive: false};
end
private
def user_params
params.require(:user).permit(:username, :email, responses_attributes: [:content])
end
class User < ActiveRecord::Base
attr_accessible :responses_attributes
has_many :responses, :dependent => :destroy, :inverse_of => :user
accepts_nested_attributes_for :responses
# ...
end
class Response < ActiveRecord::Base
belongs_to :user, :inverse_of => :responses
validates_presence_of :user, :content
end
class用户:destroy,:反转=>:user
接受:响应的\u嵌套\u属性\u
# ...
结束
响应.rb
class User < ActiveRecord::Base
has_many :responses, :dependent => :destroy
accepts_nested_attributes_for :responses
before_save { self.email = email.downcase }
validates :username, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX } ,
uniqueness: {case_sensitive: false};
end
private
def user_params
params.require(:user).permit(:username, :email, responses_attributes: [:content])
end
class User < ActiveRecord::Base
attr_accessible :responses_attributes
has_many :responses, :dependent => :destroy, :inverse_of => :user
accepts_nested_attributes_for :responses
# ...
end
class Response < ActiveRecord::Base
belongs_to :user, :inverse_of => :responses
validates_presence_of :user, :content
end
类响应:responses
验证是否存在:用户::内容
结束
我将这一行替换为“attr\u accessible:responses\u attributes,:responses,:email,:username”。我必须在GEM文件中添加“protected_attributes”,以使Rails接受attr_accessible。仍然没有保存响应。@user3234309,请查看更新。我之前没有注意到强参数的使用。使用上面的Rails4方式,您可以删除受保护的\u属性
gem。删除attr\u可访问行和gem后,现在用户名和电子邮件的验证也失败了。我在强参数中添加了“responses\u attributes:[:content]”。谢谢你的帮助@iandotkelly,这只是因为我没有通过响应状态的验证;如果我取出验证,它会正确地保存它,但没有附加的响应。如果不保存孩子,Rails肯定是一个糟糕的家长