ruby-on-rails - 创建 has_many :through association in Rails 4 with building a new object

标签 ruby-on-rails

有以下代码:

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/

相关文章:

ruby-on-rails - request.xhr CORS 布局失败

ruby-on-rails - Moped::BSON::ObjectId 或 Rails 模型中父 ID 的字符串?

ruby-on-rails - 使用 Rails 3.2.2 安装 Mongoid

ruby-on-rails - Rails 3 : How to stop logger from logging/healthcheck requests?

ruby-on-rails - 根据 Ruby on Rails 最佳实践,哪里是存储调用第三方 api 的逻辑的好地方?

ruby-on-rails - Rails 将协议(protocol)设置为始终 HTTP

ruby-on-rails - Rails - 错误部分未渲染

ruby-on-rails - ruby rails : Use slug instead of id on resource routes

JavaScript Rails 代码无法在 application.js 中运行

ruby-on-rails - 尝试发送电子邮件时出现 sidekiq_mailer 错误