我有一个表单,我有一个管理员创建新用户。表单使用我创建的用户模型(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>;
我希望它看起来像这样:
让这项工作最好的方法是什么?
答案 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中0
为true
。)