第二步_form后如何“创建”?

因此,在第一步中,用户创建了他的挑战。

    

然后他被引导到另一个_form完成添加有关该挑战的细节。

       

一旦他添加了这些细节并点击“保存”,我希望通过challenge_controller的Create操作创建challenges_controller

 def step_one ?? end def create @challenge = Challenge.new(challenge_params) @challenge.save redirect_to challenging_url(@challenge) end 

如果要跨两个请求创建记录,则需要保留第一个请求中的数据,并将其与第二个请求一起重新提交。

实现此目的的最简单和最“Rails”的方法是接受来自第一个请求的传入“name”属性,并渲染第二个阶段的表单,其名称保持为隐藏字段。

应用程序/控制器/ challenge_controller

 # Show "step 1" form def new @challege = Challenge.new end # Show "step 2" form, OR, attempt to save the record def create @challenge = Challenge.new(params[:challenge]) if params[:step] == '2' if @challenge.save redirect_to @challenge, notice: "Challenge saved!" end end # Fall through to render "create.html.erb" end 

应用程序/视图/挑战/ new.html.erb

 <%= form_for @challenge do |f| %> <%= f.input_field :name %> <%= f.submit %> <% end %> 

应用程序/视图/挑战/ create.html.erb

 <%= form_for @challenge do |f| %> <%= f.hidden_field :name %> <%= hidden_field_tag :step, 2 %> <%= f.text_field :action %> <%= f.date_select :deadline %> <%= f.check_box :conceal %> <%= f.submit %> <% end %> 

这里有几点需要注意:

  • create呈现与new不同的forms。 这对于Rails应用程序来说是非典型的
  • create提供的“step 2”表单使用hidden_field_tagparams[:challenge]属性之外为提交附加一个额外的值
  • validation未处理 – 如果某人在步骤1中提交了空名称,或者在步骤2中提交了其他无效属性,则由您自行显示错误

答案更可能是“这取决于你要做什么”,但最简单的解决方案是将(在保存后创建)重定向到包含所有或其他字段的编辑操作/视图,而不仅仅是您提供的有限字段在新的操作/视图中。

 def create @challenge = Challenge.new(challenge_params) if @challenge.save redirect_to edit_challenge_url(@challenge), notice: "Saved!" else render :new end end