Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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_Ruby On Rails 4_Parent Child_Nested Forms - Fatal编程技术网

Ruby on rails Rails-从子窗体创建父实例

Ruby on rails Rails-从子窗体创建父实例,ruby-on-rails,ruby-on-rails-4,parent-child,nested-forms,Ruby On Rails,Ruby On Rails 4,Parent Child,Nested Forms,我试着做一种“接受嵌套属性”的反向操作。我想从“children#controller#create”创建一个父实例。也许你会给我一些建议,或者向我解释,这样做是不相关的。我对每一条评论都持开放态度 我有一个客户模型: class Client < ActiveRecord::Base has_one :magazine validates :name, presence: true, uniqueness: true end 我总是以PG::错误结束: PG::ForeignK

我试着做一种“接受嵌套属性”的反向操作。我想从“children#controller#create”创建一个父实例。也许你会给我一些建议,或者向我解释,这样做是不相关的。我对每一条评论都持开放态度

我有一个客户模型:

class Client < ActiveRecord::Base
  has_one :magazine
  validates :name, presence: true, uniqueness: true
end
我总是以PG::错误结束:

PG::ForeignKeyViolation - ERROR:  insert or update on table "magazines" violates foreign key constraint "fk_rails_cd907cfe6d"
DETAIL:  Key (client_id)=(51) is not present in table "clients".
就好像客户机没有保存在数据库中一样。当我
binding.pry
并在@Client.save之后调用
Client.all
时,它不会返回我的新客户端

我有点惊讶,因为在另一个项目中,我遇到了类似的问题,这样做效果很好。供您参考:

# Previous Project
# Gemfile.lock
pg (0.18.3)
rails (4.2.0)

#Current Project
# Gemfile.lock
pg (0.18.4)
rails (4.2.5.1)
提前感谢你的帮助。如果您对从children\u controller在child之前创建父实例的良好实践有任何建议,我非常感兴趣

PS1:在控制器中,我尝试了注释优先或创建,输出仍然相同。
PS2:如果您需要有关Gemfile的更多信息,请告诉我。

请尝试下面的代码,这将解决问题。我认为问题在于你试图在拯救客户之前拯救杂志。此外,您应该检查@client.valid?是否为真,如果不是,请检查@client.errors。另外,按如下所示重写控制器

def create
  @client = Client.find_by_name(params[:magazine][:client_id])

  if @client.nil?
    @client = Client.new(name: params[:magazine][:client_id])
  end

  @selected_magazine = @client.magazines.new(magazine_params)

  authorize @selected_magazine

  @title = magazine_params[:title]
  @selected_issue = nil
  @issues = nil

  @client.save
  @magazines = policy_scope(Magazine)
end

def magazine_params
  params.require(:magazine).permit(:title, :analytics_id, :launch_date)
end

请尝试下面的代码,这应该可以解决问题。我认为问题在于你试图在拯救客户之前拯救杂志。此外,您应该检查@client.valid?是否为真,如果不是,请检查@client.errors。另外,按如下所示重写控制器

def create
  @client = Client.find_by_name(params[:magazine][:client_id])

  if @client.nil?
    @client = Client.new(name: params[:magazine][:client_id])
  end

  @selected_magazine = @client.magazines.new(magazine_params)

  authorize @selected_magazine

  @title = magazine_params[:title]
  @selected_issue = nil
  @issues = nil

  @client.save
  @magazines = policy_scope(Magazine)
end

def magazine_params
  params.require(:magazine).permit(:title, :analytics_id, :launch_date)
end

你可以参考。用例子解释得很好。它可能会解决您的问题。

您可以参考。用例子解释得很好。它可能会解决您的问题。

您可能希望尝试对您的关联进行反向操作,例如:

class Client < ActiveRecord::Base
  has_one :magazine, inverse_of: :client
  validates :name, presence: true, uniqueness: true
end
class客户端

class杂志
进一步阅读:


不过,一般的用例是使用
有许多

您可能希望尝试对您的关联进行
反向操作,例如:

class Client < ActiveRecord::Base
  has_one :magazine, inverse_of: :client
  validates :name, presence: true, uniqueness: true
end
class客户端

class杂志
进一步阅读:


不过,一般用例是带有
的,它有许多

您可以参考这些来了解接受嵌套属性的实际实现吗。首先,确保您获得了一个
Client
的实例,不要使用旧语法
Client。按名称(magazine\u params[:Client\u id])
查找\u,像这样使用smth:
Client.where(name:magazine\u params[:Client\u id])。首先第二,确保保存了
客户端
实例,您可以调用
@Client.save为此目的。@VaibhavDhoke,我正在尝试对从父级到子级的嵌套属性进行反向[link().如果我以你为例,我想从一对一的地址表单创建一个用户association@BitOfUniverse我尝试了你的语法。
。首先!
按预期引发错误。同样的错误会通过save复制。非常奇怪的是,它会验证
@client.save
,但不会将其添加到数据库中(
Client.all
不包括新实例”)您可以参考此来实际实现接受嵌套属性。首先,确保您获得了
Client
的实例,不要使用旧语法
Client。按名称查找(杂志参数[:客户机id])
,使用smth如下:
Client.where(名称:杂志参数[:client_id])。首先!
其次,确保保存了
client
实例,您可以为此调用
@client.save!
。@VaibhavDhoke,我正在尝试反向嵌套属性,从父级到子级[link().如果我以你为例,我想从一对一的地址表单创建一个用户association@BitOfUniverse我尝试了你的语法。
。首先!
按预期引发错误。同样的错误会通过save复制。非常奇怪的是,它会验证
@client.save
,但不会将其添加到数据库中(
Client.all
不包括新实例)客户机和mag之间的关系是
有一个属于
所以
@selected\u-magazine=@Client.magazies.new(magazine\u-params)
引发错误。当我分成两行并使用Singure时,我得到一个有效的客户机和一个无效的杂志(没有客户机id).I get
PG::ForeignKeyViolation-错误:表“客户端”上的更新或删除违反了表“杂志”上的外键约束“fk_rails_cd907cfe6d”详细信息:键(id)=(55)仍然从表“杂志”引用。
客户端和杂志之间的关系是
有一个属于
所以
@selected_magazine=@client.gazings.new(magazine_params)
引发错误。当我分成两行并使用Singure时,我得到一个有效的客户端和一个无效的库(没有客户端id)。我得到
PG::ForeignKeyViolation-错误:表上的更新或删除“客户端”违反了表“magazine”上的外键约束“fk_rails_cd907cfe6d”详细信息:键(id)=(55)仍然是从表“杂志”中引用的。
从我读到的内容中,接受嵌套的属性只从父级到子级。不是相反(),不是吗?这也是我的理解,尽管我不明白为什么会这样。有些用例您希望创建(或选择现有的)当通过新的子窗体创建子窗体时,为父。是否有更好的方法
class Magazine < ActiveRecord::Base
  belongs_to :client, inverse_of: magazine
  validates :client, :launch_date, presence: true
  # accepts_nested_attributes_for :client
end