首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未使用accepts_nested_attributes_for和decent_exposure设置关联id

未使用accepts_nested_attributes_for和decent_exposure设置关联id
EN

Stack Overflow用户
提问于 2011-09-24 23:55:40
回答 1查看 1.9K关注 0票数 6

当我发布一个表单来创建一个带有子评论的新查询时(在应用程序中,查询可以有多个评论),评论不会被构建。当删除存在验证时,它会起作用。因此,它与构建和保存事物的顺序有关。如何保存验证并保持代码的整洁?

(以下是一个示例,因此它可能不是完全可运行的)

models/quiiry.rb

代码语言:javascript
运行
复制
class Inquiry < ActiveRecord::Base
  has_many :comments
  accepts_nested_attributes_for :comments

models/comment.rb

代码语言:javascript
运行
复制
class Comment < ActiveRecord::Base
  belongs_to :inquiry
  belongs_to :user
  validates_presence_of :user_id, :inquiry_id

控制器/inquiry_controllers.rb

代码语言:javascript
运行
复制
expose(:inquiries)
expose(:inquiry)

def new
  inquiry.comments.build :user => current_user
end

def create
  # inquiry.save => false
  # inquiry.valid? => false
  # inquiry.errors => {:"comments.inquiry_id"=>["can't be blank"]}
end

视图/查询/new.html.haml

代码语言:javascript
运行
复制
= simple_form_for inquiry do |f|
  = f.simple_fields_for :comments do |c|
    = c.hidden_field :user_id
    = c.input :body, :label => 'Comment'
= f.button :submit

数据库架构

代码语言:javascript
运行
复制
create_table "inquiries", :force => true do |t|
  t.string   "state"
  t.datetime "created_at"
  t.datetime "updated_at"
end
create_table "comments", :force => true do |t|
  t.integer  "inquiry_id"
  t.integer  "user_id"
  t.text     "body"
  t.datetime "created_at"
  t.datetime "updated_at"
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-20 10:26:43

基本上,在保存之前,您还在测试inquiry_id的存在,这是从注释到查询的返回关联,只有在保存注释之后才能设置。实现这一点并仍然保持验证完好无损的另一种方法是:

代码语言:javascript
运行
复制
comment = Comment.new({:user => current_user, :body => params[:body]
comment.inquiry = inquiry
comment.save!
inquiry.comments << comment
inquiry.save!

或者另一种方式是

代码语言:javascript
运行
复制
= simple_form_for inquiry do |f|
  = f.simple_fields_for :comments do |c|
    = c.hidden_field :user_id
    = c.hidden_field :inquiry_id, inquiry.id
    = c.input :body, :label => 'Comment'
= f.button :submit

基本上就是在评论表单中添加以下行

代码语言:javascript
运行
复制
    = c.hidden_field :inquiry_id, inquiry.id
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7540087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档