在我正在开发的Rails 3应用中,我们允许用户“激活”一个帐户(通过输入优惠券代码),然后他们输入他们的信息,然后创建他们的帐户。
我遇到了一个小问题,我不清楚如何在不重复代码的情况下解决(这似乎并不雄辩)。
这是我当前的激活控制器:
class ActivationsController < ApplicationController
respond_to :html
skip_before_filter :set_client, :only => [:welcome]
def new
@user = User.new
@gc = get_group_code(params[:group_code])
if @gc.nil? || @gc.group.school_info.blank?
@countries = Country.all
@school_types = SchoolType.all
@states = State.all
else
@school_information = @gc.group.school_info
end
@user_type = UserType.find_by_type("Classroom Teacher")
end
def create
@user = User.new(params[:user].except(:custom))
if @user.save
@group = Group.find(params[:group_id])
@user.groups << @group
@user.update_mail_chimp_sponsors
UserMailer.welcome_email(@user, current_client).deliver
sign_in @user
redirect_to new_activation_welcome_path
else
render :new
end
end
def welcome
@user = current_user
end
private
def get_group_code(code = "")
group_code = GroupCode.find_by_code(code)
unless group_code.nil?
group_code.validate_code(current_client.name)
group_code
end
end
end
我遇到的问题是在第31行(render :new
)。当表单出错并且应用程序呈现new
方法时,视图无法使用新方法中的实例变量。我该如何解决这个问题?
答案 0 :(得分:2)
Render:new就是这样:它呈现:new视图。它不会在控制器中执行新方法,因此在您调用render的任何方法中:new必须设置:new模板所需的实例变量。
您不希望重复代码,您可以将实例变量的设置移动到控制器中的私有方法。然后,您可以从新方法调用私有方法,以及从中呈现的任何其他方法:new。