Ruby on rails Rails-从子窗体创建父实例
我试着做一种“接受嵌套属性”的反向操作。我想从“children#controller#create”创建一个父实例。也许你会给我一些建议,或者向我解释,这样做是不相关的。我对每一条评论都持开放态度 我有一个客户模型: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
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 getPG::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