- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有两个模型 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 但感觉不对。
这让我发疯,我需要 sleep 。
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'
如果您已经走到这一步,我衷心感谢您。
最佳答案
你需要在这里改变一些东西。首先:
= 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` 并将其视为关联。然后在您的 Controller 中将您的显示操作更改为:
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: true
添加到您的 accepts_nested_attributes_for
调用中。
你可以稍微改进一下你的表演 Action 。首先,我注意到如果尚未声明任何操作,您将在每个操作中构建一个空管道。这意味着您可能应该将此逻辑移至您的模型中:
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
关于ruby-on-rails - has_one 嵌套属性不保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23404542/
试图为这个问题提出一个 has_one 关联。我有两个表: Ca: :id :serial ... Cert: :id :ca_id :serial ... 给定的 cas
我有以下 Person具有也是另一个 Person 的父级的类。我似乎无法弄清楚如何让关系发挥作用。 class Person 'Person', :primary_key => "mom_id",
对于 has_one关联我可以建立这样的关联: foo.build_bar() 我应该如何构建 has_one, through:协会? 例如: class Foo has_one :bar
这是我的模型: Class Audition belongs_to :video end Class Video has_one :audition end 和我的工厂: Factory.de
我有两个模型,用户和帐户。每个用户可以拥有一个帐户。 为用户创建帐户工作正常。我的问题是,当我尝试更新帐户时,以前的帐户 user_id 无效,并使用 user_id 创建了一个新的帐户行。我不希望这
我有 3 个相关的表/模型。我想检索组织派对的用户,给定一个派对记录,一个带有 bool 值的连接表 organized列和用户表。 迄今为止我最好的尝试(经过多次摆弄后,这对我来说最有意义)。我省略
我们有一个 Company、CompanyUser、User 和 Rating 模型,定义如下: 公司模式 class Company :job) 但这给了我错误,因为 @company.owner
我有一个使用 cocoon gem 的嵌套表单,深度为 5 个类。它们都是belongs_to和has_many,除了具有has_one和belongs_to关联的第二个最嵌套类之外。每当我编辑它时,
我有一个使用 cocoon gem 的嵌套表单,它包含 5 个类的深度。它们都是 belongs_to 和 has_many,除了一个是具有 has_one 和 belongs_to 关联的第二大嵌套
出席和凭单: belongs_to :event belongs_to :account 因此:出勤率和凭单之间是一对一的关系。 有没有办法不用我想太多就可以做到这一点? # attendment h
在组合 has_one 关联和 includes 时,我一直在尝试找出一些奇怪的行为。 class Post { order('comments.id DESC').limit(1) }, clas
Rails 的 has_one 在哪个级别运行? 例子: class User has_one :comment end class Comment belongs_to :user end
文件:User.rb has_one:自行车 文件:Bike.rb belongs_to:用户 这是我在 Bike 和 User 模型中的关系。我的数据库已经包含大量自行车和用户的数据。 如何使用不遵
我正在尝试从 has_one 关联中获取一些信息,但无法获得正确的调用方式。我有 2 个表,一个学生表,其中有一个 emergency_contact。 emergency_contact 表有一个外
我想要关系及其参数的基本语法 我需要这些说明 BELONGS_TO 和 HAS_ONE 的区别? 我想在 CGridView 上使用关系(该关系将另一个表元素称为外键)例如我有三张 table 信使
我刚刚发明了一个愚蠢的小辅助函数: def has_one(seq, predicate=bool): """Return whether there is exactly one item
我有两个模型 Project 和 ProjectPipeline。 我想创建一个项目表单,该表单也包含来自 ProjectPipeline 模型的字段。我已成功创建表单,但是当我点击保存时,值并未存储
我在drivers表中定义了has_one关系 has_one :current_haul 与hauls表关联。 还有 hauls 表和 drivers 表,它们都有 organization_id。
我有一个保存良好的主要对象。现在我在潜在客户和事件之间添加了 has_one 关联。一项事件有一个线索,其中线索具有外键 campaign_id。我的模型中有以下内容: class Campaign
在我的 Rails 应用程序中,我只要求用户在注册时输入电子邮件和姓名,然后让他们选择为他们的个人资料提供更完整的联系方式。因此,我有一个与 Contact.rb 关联的 User.rb 模型,即,
我是一名优秀的程序员,十分优秀!