ActiveRecord的条件值仅限创建方法

时间:2010-12-28 03:50:00

标签: ruby-on-rails activerecord model

我有一个表单,我有一个管理员创建新用户。表单使用我创建的用户模型(login,password,first_name等...)。对于表单上的最后一个字段,我希望有一个复选框,不需要存储为用户记录的一部分,但控制器需要它。这将控制新创建的用户是否会收到欢迎电子邮件。这是在Rails 3.0.3中。

def create
  @user = User.new(params[:user])

  if @user.save
    if @user.send_welcome_email
      UserMailer.welcome_email(@user).deliver
    end
    redirect_to(admin_users_url, :notice => "User #{@user.name} was successfully created.")
  else
    render :action => "new"
  end
end

在我看来(haml)我试图像这样访问它:

  %p
    Send Welcome Email?
    = f.check_box :send_welcome_email

我试图将其设为attr_accessible: :send_welcome_email,但控制器无法识别它。我得到了

undefined method 'send_welcome_email' for #<User:0x00000100d080a8>;

我希望它看起来像这样:

让这项工作最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

您想要的不是attr_accessible,而是attr_accessor。就是这样。

但是,如果将电子邮件发送代码移至观察者,您的代码将会更好看。

答案 1 :(得分:0)

由于您没有将其保存在用户身上,因此您可以使用check_box_tag而不是f.check_box,并使用params [:send_welcome_email]访问它。虽然你拥有它,但我认为你可以用params [:user] [:send_welcome_email]来访问它。

答案 2 :(得分:0)

作为attr_accessor的替代方案,您始终可以先从参数中删除它:

def create
  send_welcome_email = params[:user].delete(:send_welcome_email)
  @user = User.new(params[:user])

  if @user.save
    UserMailer.welcome_email(@user).deliver if send_welcome_email
    redirect_to(admin_users_url, :notice => "User #{@user.name} was successfully created.")
  else
    render :action => "new"
  end
end

您可能必须确保参数已成功转换为布尔值;否则条件将始终为真(Ruby中0true。)