我是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" }
如果需要进一步的信息,请告诉我。
答案 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
方法没有定义它。