【发布时间】:2014-05-01 08:42:00
【问题描述】:
我有两个模型 Project 和 ProjectPipeline。
我想创建一个项目表单,该表单也包含来自 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
我并不总是想要一个项目管道,而是在基于用户查看项目的正确条件下。我希望构建项目管道字段,但仅在用户选择保存/填充它们时才保存。
因此,当显示项目时,我使用 project_id: from params[: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'
如果你能走到这一步,我真诚地感谢你。
【问题讨论】:
标签: ruby-on-rails ruby rails-activerecord model-associations strong-parameters