在控制器中创建新站点时为用户分配 site_id。

Assigning user a site_id on creating a new site in controller.

到目前为止我有 user belongs_to :sitessite has_many :users。我在站点架构中有 user_id,在用户架构中有 site_id

我正在尝试将其设置为在用户创建新站点后将 site_id 分配给该用户。每个用户只能创建一个站点。

我在 sites_controller.rb 中尝试过 @user.site_id = Site.find(params[:id]),但没有成功。

sites_controller.rb

  def create
    @site = Site.new(site_params)
    @site.user_id = current_user.id
    respond_to do |format|
      if @site.save
        format.html { redirect_to @site, notice: 'Site was successfully created.' }
        format.json { render :show, status: :created, location: @site }
      else
        format.html { render :new }
        format.json { render json: @site.errors, status: :unprocessable_entity }
      end
    end
  end

registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController
  respond_to :json

  def create
    build_resource(sign_up_params)
    resource.save
    yield resource if block_given?

    if resource.persisted?
      if resource.active_for_authentication?
        message = find_message(:signed_up)
        flash[:notice] = message
        sign_up(resource_name, resource)
        if request.xhr?
          return render :json => {:success => true, :data =>  {:message => message}}
        else
          respond_with resource, location: after_sign_up_path_for(resource)
        end
      else
        message = find_message(:"signed_up_but_#{resource.inactive_message}" )
        expire_data_after_sign_in!
        if request.xhr?
         return render :json => {:success => true, :data =>  {:message => message}}
        else
          respond_with resource, location: after_inactive_sign_up_path_for(resource)
        end
      end
    else
      clean_up_passwords resource
      messages = resource.errors.messages
      if request.xhr?
       return render :json => {:success => false, :data =>  {:message => messages}}
      else
        respond_with resource
      end
    end
  end

  def sign_up_params
    params.require(:user).permit(:email, :password, :password_confirmation)
  end
end

通过 user association 创建它。

def create
  respond_to do |format|
    if current_user.create_site(site_params)
      format.html { ... }
      # ...
    else
      # ...
    end
  end
end

如果站点是作为注册的一部分创建的,因为如果不创建他们的站点关联就无法创建用户,那么将上面的行放在用户创建方法中他们签名的点之后的某个位置英寸

如果您在创建用户后没有登录,而他们必须从头开始登录,请在会话结束后将此行放入您的登录方法(UserSession#create 或其他)并且 current_user 可用,检查他们是否已经分配了一个,这样您就不会破坏他们现有的站点。

当您使用has_many和belongs_to时rails为您提供构建方法。

 current_user.sites.build(site_params)

对 sites_controller.rb 执行此操作将为 current_user.site_id 提供刚刚创建的 @site.id。

  def create
    @site = Site.new(site_params)
    @site.user_id = current_user.id
    respond_to do |format|
      if @site.save
        format.html { redirect_to @site, notice: 'Site was successfully created.' }
        format.json { render :show, status: :created, location: @site }
      else
        format.html { render :new }
        format.json { render json: @site.errors, status: :unprocessable_entity }
      end
    end
    if current_user.site_id.blank?
      current_user.site_id = @site.id
      current_user.save
    end 
  end