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

时间:2016-11-16 07:56:05

标签: ruby-on-rails ruby ruby-on-rails-5

到目前为止,我有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

3 个答案:

答案 0 :(得分:1)

通过user association创建它。

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

如果网站是作为注册的一部分创建的,那么您无法在不创建网站关联的情况下创建用户,那么请在用户创建方法中的某个位置之后的某个位置抛出上述行。重新登录。

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

答案 1 :(得分:0)

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

 current_user.sites.build(site_params)

答案 2 :(得分:-1)

对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