如何在没有 instance_params 中的参数之一的情况下更新实例?

How to update an instance without one of the params from the instance_params?

我有一个带有更新方法的 user_controller。根据用户的来源,我有时不得不为用户传递一个额外的参数(:tournament),它实际上不会更新用户实例,但可以帮助我在结束时将用户重定向到正确的页面更新操作。

这是我的更新方法:

  def update
    authorize @user
    if @user.subscriptions.exists? && !@user.judge? && user_params[:birthdate].present?
      flash[:alert] = "Vous ne pouvez plus modifier votre date de naissance après vous etre inscrit à une compétition. Merci de contacter l'administrateur du site"
      redirect_to user_path(current_user)
    elsif @user.update(user_params)
      if @user.judge? && @user.profile_complete? && !@user.accepted
        UserMailer.judge_waiting_for_confirmation(@user).deliver
        redirect_to user_path(current_user)
      else
        redirect_to user_path(current_user)
      end
    else
      render 'edit'
    end
  end

当我尝试使用 user_params 更新我的用户时,问题出在 elsif 中,它抛出一个错误 unknown attribute 'tournament' for User.

我的用户参数看起来像这样:

  def user_params
    params.require(:user).permit(
      :extradoc,
      :address,
      :birthdate,
      :certifmedpicture,
      :club,
      :email,
      :first_name,
      :genre,
      :judge_number,
      :last_name,
      :licence_number,
      :licencepicture,
      :login_aei,
      :name,
      :password_aei,
      :picture,
      :ranking,
      :telephone,
      :sms_forfait,
      :sms_quantity,
      :tournament
    )
  end

如何在不使用 :tournament 参数的情况下更新我的用户,同时允许它,以便我可以使用它在操作结束时将我的用户重定向到正确的位置?

您需要为 tournament 属性创建 attr_accessor 才能实现此目的。

因此进入您的用户模型并为 tournament 创建 attr_accessor,如下所示:

attr_accessor :tournament

现在您可以在表单中设置锦标赛价值。从 user_params.

中删除 tournament

您可以在 params[:user][:tournament] 检查和重定向中获取价值。您的对象也会正确更新。