验证失败后保留表单字段,“渲染”不起作用

时间:2012-07-16 13:19:02

标签: ruby-on-rails ruby-on-rails-3 validation

我是Rails的新手,正在尝试修改由其他团队编写的应用。我有一个常见问题,即在验证失败后需要保留表单字段。在我们的应用程序中,用户提交基本信息,如姓名,电子邮件和邀请代码。我在控制器中验证邀请代码。如果失败,它当前会执行redirect_to :back,但会丢失用户填写的信息并清除表单。从我研究过的其他页面来看,正确的做法是render :action => :new。但是,当我尝试时,我会收到错误。

这次尝试......

format.html { render :action => "new" }

所有的结果都是......

  

缺少模板

     

缺少模板after_step / new,application / new with ...

以前的开发人员设置它的方式,表单的第1步是“users / registrations / new”,但是以下步骤是“after_step / step_two”等等。所以,在表单提交后,它会继续到“after_step_controller.rb”,我正在进行验证。显然,我看到它试图在该控制器上呈现“新”动作而不是“registrations_controller.rb”。

但是,当我试图强迫它时......

format.html { render :template => "registrations_controller/new" }        
format.html { render :action => "new", :controller => "registrations" }

...我仍然得到丢失的模板错误。因此,我尝试了我在网上建议的其他事情......

format.html { render :template => "users/registrations/new" }
format.html { render :file => "users/registrations/new.html.erb" }

这些都不起作用,因为他们给出了这个错误:

  

NilClass的未定义方法`model_name':Class

然后我研究了这个,大多数人说“新”功能没有创建新用户。但是,代码就在那里,所以我不确定发生了什么。

有人能指出我正确的方向吗?它显然不是一个显示阻止,但为了更好的用户体验,我希望表单字段在验证失败时保留其值。

这是一些信息...

用户/注册/ new.html.erb

<%= form_for(@user, :url => step_two_path) do |f| %>
        <div class="signup_step_mid_content">
          <div class="step_content_block">
            <h3> First, tell us a little bit about yourself:</h3>
            <div class="signup_filed_small mrgn_r_20">
              <label>First Name</label>
              <%= f.text_field :first_name, :title => "First Name", :placeholder => "First Name" %>
            </div>

registrations_controller.rb

def new
    @user = User.new
    @invite_code = params[:invite_code]
end

after_step_controller.rb

def step_two
    @user = User.find_by_email(params[:user][:email])
    respond_to do |format|

      @tester = Prefinery::Tester.new(:beta_id => 1234) 
      @tester.email = params[:user][:email]
      @tester.invitation_code = params[:user][:invitation_code]
      @tester.status = 'active' 

      if !@tester.save 
        #format.html{redirect_to :back }

        #format.html { render :template => "registrations_controller/new" }        
        #format.html { render :action => "new", :controller => "registrations" }
        #format.html { render :action => "new" }

        #format.html { render :template => "users/registrations/new" }
        #format.html { render :file => "users/registrations/new.html.erb" }

如果需要进一步的信息,请告诉我。

4 个答案:

答案 0 :(得分:4)

你对这一步是对的:

format.html { render :template => "users/registrations/new" }

问题是你没有在“after_step_controller”中为@user设置实例,如果你想做渲染,你应该为@user设置一个实例,它应该包含属性在表单中提交,因此您可以显示验证错误。

希望它有所帮助!

答案 1 :(得分:2)

嗯。这里有几点建议:

format.html { render :template => "users/registrations/new" }

或只是

format.html { render "users/registrations/new" }

似乎还有很长的路要走。我会考虑清理一些东西,并在一个特定的控制器中移动所有过程。

  • 您需要像这样初始化@user实例变量

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

(可能)使得下一表格中的用户保留表格发送的参数。

答案 2 :(得分:2)

render :new

将为您完成这项工作

答案 3 :(得分:1)

我想,你得到了

undefined method `model_name' for NilClass:Class

例外,因为new模板使用变量@user,但step_two方法没有定义它。