2

我是 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:Class 的未定义方法“model_name”

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

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

这里有一些信息...

用户/注册/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>

注册控制器.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

5 回答 5

4

这一步你是对的:

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

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

希望能帮助到你!

于 2012-07-16T14:32:28.087 回答
2

嗯。这里有几个建议:

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

要不就

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

似乎要走的路。不过,我会考虑清理一切并将所有内容移到一个特定的控制器中以用于该过程。

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

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

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

于 2012-07-16T14:39:40.457 回答
2
render :new

会为你做这项工作

于 2016-09-21T17:27:21.330 回答
1

我想,你得到了

undefined method `model_name' for NilClass:Class

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

于 2012-07-16T14:29:02.460 回答
0

我发现在模型验证失败后,文本框和单选按钮被保留,正如预期的那样。但是,选择框有问题,直到我插入 selected: 子句,如

<div class="row">
  <div class="col">
    <legend>Area of Expertise</legend>
    <%= form.select :srvy_area_of_expertise,
       options_for_select(ThemConstants::AREAS_OF_EXPERTISE,
          **selected: @survey.srvy_area_of_expertise**),
      id: :survey_srvy_area_of_expertise,
      include_blank: true,
      prompt: "Choose one",
      class: "form-control"%>
    <%= text_field_tag :other_area_of_expertise, @survey.srvy_area_of_expertise, class: 'form-control',
      placeholder: "If 'Other' type area of expertise here" %>_
  </div>
于 2017-08-12T00:19:45.227 回答