gpt4 book ai didi

ruby-on-rails - 尝试使用 has_many 以 rails 形式创建嵌套关联时完全陷入困境

转载 作者:行者123 更新时间:2023-12-04 11:07:50 26 4
gpt4 key购买 nike

我发布了一个关于此的早期问题,并被建议阅读大量相关信息。我已阅读并尝试实现大约 30 种不同的解决方案。其中没有一个对我有用。

这就是我所拥有的。

我有一个微型模型。
我有一个制造商模型。
微缩模型通过 Productions 模型有许多制造商。

关联似乎设置正确,因为我可以在 View 中显示它们并通过控制台创建它们。我遇到的问题是让 Miniatures NEW 和 EDIT View 创建并更新到 Productions 表。

在控制台中输入命令 @miniature.productions.create(manufacturer_id: 1)作品,这让我相信我应该能够以某种形式做同样的事情。

我认为我的问题总是出在 Miniatures Controller 中,特别是 CREATE 函数。我在那里尝试了很多其他人的解决方案,但没有一个成功。我的表单中的 field_for 内容也可能是错误的,但这似乎不那么繁琐。

我已经坚持了几天,虽然还有其他事情我可以做,但如果这种关联是不可能的,那么我需要重新考虑我的整个应用程序。

该表单现在在 Productions 表中创建一行,但不包括所有重要的制造商 ID。

非常感谢任何帮助。

我的新微型表格

<% provide(:title, 'Add miniature') %>
<h1>Add a miniature</h1>

<div class="row">
<div class="span6 offset3">
<%= form_for(@miniature) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.fields_for :production do |production_fields| %>
<%= production_fields.label :manufacturer_id, "Manufacturer" %>
<%= production_fields.select :manufacturer_id, options_from_collection_for_select(Manufacturer.all, :id, :name) %>
<% end %>
<%= f.label :release_date %>
<%= f.date_select :release_date, :start_year => Date.current.year, :end_year => 1970, :include_blank => true %>

<%= f.submit "Add miniature", class: "btn btn-large btn-primary" %>
<% end %>
</div>
</div>

微型 Controller
class MiniaturesController < ApplicationController
before_action :signed_in_user, only: [:new, :create, :edit, :update]
before_action :admin_user, only: :destroy

def productions
@production = @miniature.productions
end

def show
@miniature = Miniature.find(params[:id])
end

def new
@miniature = Miniature.new
end

def edit
@miniature = Miniature.find(params[:id])
end

def update
@miniature = Miniature.find(params[:id])
if @miniature.update_attributes(miniature_params)
flash[:success] = "Miniature updated"
redirect_to @miniature
else
render 'edit'
end
end
def index
@miniatures = Miniature.paginate(page: params[:page])
end

def create
@miniature = Miniature.new(miniature_params)
if @miniature.save
@production = @miniature.productions.create
redirect_to @miniature
else
render 'new'
end
end

def destroy
Miniature.find(params[:id]).destroy
flash[:success] = "Miniature destroyed."
redirect_to miniatures_url
end

private
def miniature_params
params.require(:miniature).permit(:name, :release_date, :material, :scale, :production, :production_attributes)
end

def admin_user
redirect_to(root_url) unless current_user.admin?
end

def signed_in_user
unless signed_in?
store_location
redirect_to signin_url, notice: "Please sign in."
end
end
end

微型模型
class Miniature < ActiveRecord::Base
has_many :productions, dependent: :destroy
has_many :manufacturers, :through => :productions
accepts_nested_attributes_for :productions

validates :name, presence: true, length: { maximum: 50 }
validates :material, presence: true
validates :scale, presence: true
validates_date :release_date, :allow_blank => true

def name=(s)
super s.titleize
end

end

量产型号
class Production < ActiveRecord::Base
belongs_to :miniature
belongs_to :manufacturer



end

制造商型号
class Manufacturer < ActiveRecord::Base
has_many :productions
has_many :miniatures, :through => :productions
validates :name, presence: true, length: { maximum: 50 }
accepts_nested_attributes_for :productions
end

最佳答案

而不是调用:

@production = @miniature.productions.create

尝试 Rails 的“构建”方法:
def new
@miniature = Miniature.new(miniature_params)
@miniature.productions.build
end

def create
@miniature = Miniature.new(miniature_params)
if @miniature.save
redirect_to @miniature
else
render 'new'
end
end

使用构建方法使用 ActiveRecord 的自动保存关联功能。

http://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html

您还需要更新您的 params 方法,例如
def miniature_params
params.require(:miniature).permit(:name, :release_date, :material, :scale, productions_attributes: [:manufacturer_id])
end

另外你的 fields_for 应该是复数(我认为)......
<%= f.fields_for :productions do |production_fields| %>

关于ruby-on-rails - 尝试使用 has_many 以 rails 形式创建嵌套关联时完全陷入困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19229638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com