7

ユーザーを管理者として編集しようとしているときに検証をスキップしたい。

モデル

class User
  ...
  attr_accessible :company_id, :first_name, :disabled, as: :admin

コントローラ

class Admin::UsersController
  ...
  def update
    @user = User.find(params[:id])
    @user.update_attributes(params[:user], as: :admin)
    redirect_to edit_admin_user_path(@user), :notice => "User Account Updated"
  end

だから私はupdateアクションをに変更しようとしました

def update
  @user = User.find(params[:id])
  @user.attributes = params[:user]
  @user.save(validate: false)
  redirect_to edit_admin_user_path(@user), :notice => "User Account Updated"
end

しかし、どこに設定すればよいかわからないため、セット:disabledと属性にアクセスできません。:company_idas: :admin

4

3 に答える 3

14

これを試して:

@user = User.find(params[:id])
@user.assign_attributes(params[:user], as: :admin)
@user.save(validate: false)
于 2012-12-25T15:44:37.540 に答える
5

強力なパラメータ

これは長い間Railsの問題でしたが、Rails4では「強力なパラメーター」が導入されています。

Rails3アプリケーションでも強力なパラメーターgemを使用できます

代替:コンテキスト属性

これを行う別の方法は、ユーザーモデルにコンテキスト変数を導入することです-*attr_accessibleの'as'オプションに精通していないことに注意してください*

class User < ActiveRecord::Base

  attr_accessor :is_admin_applying_update

  validate :company_id, :presence => :true, :unless => is_admin_applying_update
  validate :disabled, :presence => :true, :unless => is_admin_applying_update
  validate :first_name, :presence => :true, :unless => is_admin_applying_update
  # etc...

管理コントローラーで、is_admin_applying_update属性をtrueに設定します

class Admin::UsersController
  # ...
  def update
    @user = User.find(params[:id])
    @user.is_admin_applying_update = true
    @user.update_attributes(params[:user])

注:検証をグループ化して、単一の条件付きを使用することもできます

于 2012-12-25T16:13:19.743 に答える
0

ハック方法:

def update
  @user = User.find(params[:id])
  @user.define_singleton_method :run_validations! do true; end
  @user.update_attributes(params[:user], :as => :admin)
  redirect_to edit_admin_user_path(@user), :notice => "User Account Updated"
end
于 2012-12-25T15:51:44.003 に答える