有以下代码:
def create
@business = user.businesses.build(business_params)
if @business.save
business.set_logo_url
redirect_to admin_businesses_path, flash: { notification: 'New business has been created successfully' }
else
render 'new'
end
end
在此代码运行之前;用户“has_many”业务并且一切都运行良好,但现在用户“has_many :through”和此代码创建了一个新业务但不是关系!如何修复此代码以保存此业务逻辑?提前致谢。
最佳答案
but now user "has_many :through"
这是问题的核心 - Rails 在许多方面做得很好,但它还无法读懂思想
您遇到的问题是您正在尝试构建一个不存在的关联,或者它是另一个关联(:through
)参数的一部分。让我解释一下:
有很多
当您.build
一个对象时 - 它必须与您正在使用的“父”对象相关联。 has_many
关联直接与父对象关联,允许您单独.build
它:
#app/models/user.rb
class User < ActiveRecord::Base
has_many :businesses
end
这将使您能够执行以下操作:@user.businesses.build
您现在遇到的问题是,使用through
意味着您的businesses
对象不直接与您的父User
关联code> - 它通过另一个对象相关。这意味着为了构建这个更深层次的依赖对象,您必须首先构建 through
对象:
通过
您没有向我们提供您的联想,但说它们是这样的:
#app/models/user.rb
class User < ActiveRecord::Base
has_many :business_users
has_many :businesses, through: : business_users
end
#app/models/business.rb
class Business < ActiveRecord::Base
has_many :business_users
has_many :users, through: :business_users
end
#app/models/business_user.rb
class BusinessUser < ActiveRecord::Base
belongs_to :business
belongs_to :user
end
现在您必须以稍微不同的方式构建关联:
@user.business_users.build.build_business
看看如何不必调用“join”模型?
以前,您可以直接调用businesses
关联。但当您通过另一个模型时,也必须构建这个模型。
表单
转换为表单,您最终将得到以下设置:
#app/controllers/users_controller.rb
class UsersController < ApplicationController
def new
@user = User.new
@user.business_users.build.build_business
end
def create
@user = User.new user_params
@user.save
end
private
def user_params
params.require(:user).permit(:user, :params, business_users_attributes: [business_attributes: []])
end
end
#app/views/users/new.html.erb
<%= form_for @user do |f| %>
<%= f.fields_for :business_users do |bu| %>
<%= bu.fields_for :user do |u| %>
<%= u.text_field ... %>
<% end %>
<% end %>
<%= f.submit %>
<% end %>
关于ruby-on-rails - 创建 has_many :through association in Rails 4 with building a new object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25932764/