Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails嵌套表单不保存子项_Ruby On Rails_Nested Forms_Has Many - Fatal编程技术网

Ruby on rails Rails嵌套表单不保存子项

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

我的用户模型有很多反应。我正在尝试创建一个嵌套表单,以创建一个具有三个子响应的新用户。我的代码看起来与Rails cast相同,但尽管它将保存用户,但不会保存他们的响应。有人能看出哪里出了问题吗

用户\u controller.rb

我已将用户模型更新为:

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的存在
      ,使其验证
      user
      对象而不是用户id

    • 使用选项的反向。看

    更新代码

    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
    
    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肯定是一个糟糕的家长