0

私はユーザー オブジェクトを持っています。彼は、名前、user_name、パスワード (空白)、password_confirmation (空白)、電子メール、email_confirmation (空白)、略歴、画像の URL を含むプロファイルを更新できます。

私のモデルでは、すべてを入力する(blank)必要があると述べています。しかし、管理者がユーザー ページにアクセスしてユーザーのロールを更新するだけの場合、管理者として、明らかに知らないユーザー データを入力する必要はありません。

では、どうすればこれを回避できますか?代わりに、横にドロップダウンがあるユーザーのリストを作成する必要がありますか? これは、本質的に、巨大なフォームではありませんか?もしそうなら、これはどのように作成されますか?

本質的に:この状況に対処する最善の方法は何ですか?

これは現在、ユーザーが更新される方法です

  def update
    @user = User.friendly.find(params[:id])
    @user.update_attributes(user_update_params)
    if @user.save
      render :show
    else
      render :edit
    end
  end

  private

  def user_update_params
    params.require(:user).permit(:name, :user_name, :email, :email_confirmation, :password,
      :password_confirmation, :bio, :picture_url, :role)
  end 
4

2 に答える 2

1

本当の問題は、 User モデルの検証に論理エラーがあることです。

フォームの検証を行っているようですが、

validates :password, presence: true, confirmation: true

つまり、ユーザー オブジェクトを保存するたびに新しいパスワードを選択する必要があります。しかし、これはおそらくあなたが望むものではありません。この検証は、ユーザーが初めて作成されたとき、つまり新しいレコードのときにのみ適用する必要があります。

これを行うには、

validates :password, presence: true, confirmation: true, if: :new_record?
于 2013-09-08T01:04:44.460 に答える
0
update_attribute

検証を行わずに属性を更新します。これが必要です。

このAPIドキュメントをチェックしてください

編集:

ドキュメントを読むことについて話す

これはメソッドのドキュメントからの要約です

update_attribute(名前、値) public

単一の属性を更新し、レコードを保存します。これは、既存のレコードのブール フラグに特に役立ちます。また、

Validation is skipped.

Callbacks are invoked.

updated_at/updated_on column is updated if that column is available.

Updates all the attributes that are dirty in this object.

編集:

このメソッドでまだ検証する必要がある場合は、コールバックが呼び出されることが示されていることに注意してください。そのため、ここで説明されているように、入力を検証してコールバックを使用する独自のコードを記述できます

于 2013-09-07T23:09:11.997 に答える