has_one嵌套属性无法保存

杰伊·基林(Jay Killeen)

我有两个模型Project和ProjectPipeline。

我想创建一个Project窗体,其中也包含ProjectPipeline模型中的字段。我已经成功创建了表单,但是当我点击保存时,值未存储在数据库中。

project.rb

class Project < ActiveRecord::Base

  has_one :project_pipeline

  accepts_nested_attributes_for :project_pipeline

  self.primary_key = :project_id
end

projectpipeline.rb

class ProjectPipeline < ActiveRecord::Base

  belongs_to :project, autosave: :true

  validates_uniqueness_of :project_id

end

我并不总是想要项目管道,而是在用户查看项目的正确条件下进行。我希望构建项目管道字段,但仅在用户选择保存/填充它们时才保存。

因此,当显示项目时,我使用params [:id]中的project_id:建立了一个临时项目管道(不确定我是否真的需要这样做)。然后,在保存项目时,我使用create_attributes。但是,如果它已经创建或构建,我只想让has_one和belongs_to关联开始,然后使用update_attributes。

我的问题是,当我尝试保存时,如果我使用params [:project_pipeline]则遇到“禁止属性”错误,或者如果我使用project_params则什么也没有保存。我已经检查并重新检查了我所有的字段都在project_params中,甚至尝试使用project_pipeline_params,但这感觉不对。

它让我发疯,我需要睡觉。

projects_controller.rb

def show
  @project = Project.find(params[:id])
  if @project.project_pipeline
  else
    @project.build_project_pipeline(project_id: params[:id])
  end
  autopopulate
end



def update
    @project = Project.find(params[:id])
    if @project.project_pipeline
    else
      @project.build_project_pipeline(project_id: params[:id], project_type: params[:project_pipeline][:project_type], project_stage: params[:project_pipeline][:project_stage])
    end
    if @project.update_attributes(project_params)
      flash[:success] = "Project Updated"
      redirect_to [@project]
    else
      render 'edit'
    end
  end


def project_params
  params.require(:project).permit(:user_id, project_pipeline_attributes:[:project_id,:project_type,:project_stage,
      :product_volume,:product_value,:project_status,:outcome, :_destroy])
end

show.html.haml

    - provide(:title, "Show Project")
%h1= @project.project_title
= simple_form_for(@project) do |f|
  = f.input  :id, :as => :hidden, :value => @project, :readonly => true  
  = f.input :user_id, label: 'Assigned to Account Manager', :collection => @account_managers, :label_method => lambda { |r| "#{r.first_name} #{r.last_name}" }
  = f.input :project_id, :readonly => true
  = f.input :status, :readonly => true
  = f.input :project_stage, :readonly => true

  - if @project.project_codename = "project pipeline"
    = simple_fields_for @project.project_pipeline do |i|
      %h2 Project Pipeline
      - if @project.user_id == current_user.id
        = i.input :project_volume, label: 'Project Status', collection: @project_status
        = i.input :project_value, label: 'Project Status', collection: @project_status
        = i.input :project_status, label: 'Project Status', collection: @project_status
      = i.input :outcome, label: 'Outcome', collection: @outcome


    = f.submit 'Save'

如果您已经做到这一点,我衷心感谢您。

BroiSatse

解决方案

您需要在这里更改几件事。首先:

= simple_fields_for @project.project_pipeline do |i|

传递对象时,rails并不知道它将与父对象相关联,因此将创建一个名为的字段project[project_pipeline]代替project[project_pipeline_attributes]相反,您需要传递关联名称并在表单构建器上调用此方法:

= f.simple_fields_for :project_pipeline do |i|

这将检查您是否已定义project_pipeline_attributes=方法(使用accept_nested_attributes_for`并将其视为关联。然后在您的控制器中将show动作更改为:

def update
  @project = Project.find(params[:id])
  @project.assign_attributes(project_params)
  if @project.save
    flash[:success] = "Project Updated"
    redirect_to @project
  else
    render 'edit'
  end
end

并且所有应该工作。作为单独的注释,由于您允许:_destroy在嵌套参数中使用属性,因此我假设您希望能够使用嵌套属性删除记录。如果是这样,您需要添加allow_destroy: trueaccepts_nested_attributes_for通话中。

现在有点样式:

您可以稍微改善表演动作。首先,我注意到,如果尚未声明任何动作,则您将在每个动作中构建一个空管道。这意味着您可能应该将此逻辑移至模型中:

class Project < AR::Base

  after_initalize :add_pipeline

  private

  def add_pipeline
    project_pipeline || build_project_pipeline
  end
end

您还拥有神秘的方法prepopulate-最有可能的是,它也应该是模型关注的问题。

另一点:这种语法:

if something
else
  # do sth
end

以某种方式非常流行,并使代码难以理解。而是使用:

if !something
  # do something
end

或(首选)

unless something
  # do something
end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

has_one关联的嵌套属性

来自分类Dev

无法更新has_one关联的嵌套模型表单

来自分类Dev

Rails 4-如果不使用'has_one'关联创建新的嵌套模型,则无法保存模型

来自分类Dev

嵌套has_one关联的强参数

来自分类Dev

has_one的嵌套形式:through

来自分类Dev

嵌套对象has_one关系

来自分类Dev

如何保存has_one关联的嵌套资源?不允许的参数错误

来自分类Dev

具有has_one关系条件的Rails嵌套属性验证

来自分类Dev

在rails中使用has_one嵌套属性是一个好主意吗?

来自分类Dev

无法保存嵌套属性

来自分类Dev

无法使用has_one上传附件

来自分类Dev

无法保存新的关联首选项 has_one 关联

来自分类Dev

嵌套的Rails包括,belongs_to和has_one

来自分类Dev

rails嵌套模型表单has_one关联

来自分类Dev

Ruby on Rails与has_one关联的嵌套路由

来自分类Dev

如何定义一个嵌套的has_one关联?

来自分类Dev

嵌套表单属性无法保存

来自分类Dev

在has_one关联轨道上保存了多个条目

来自分类Dev

Silverstripe将对象添加/保存到has_one关系

来自分类Dev

has_one关联中的Rails 4访问表属性

来自分类Dev

在自动构建has_one子模型时设置属性

来自分类Dev

无法访问has_one关系中的道具

来自分类Dev

与has_one的多态关联,无法通过关联创建

来自分类Dev

虽然 has_one 为 has_one 构建方法

来自分类Dev

Ruby on Rails中的嵌套属性无法保存

来自分类Dev

Has_one,属于迁移

来自分类Dev

正确使用has_one

来自分类Dev

根据对象自己的属性动态设置has_many或has_one

来自分类Dev

具有has_one关系的两层深度嵌套形式的不允许的参数