第二步_form后如何"Create"?

How to "Create" after second step _form?

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

<%= form_for(@challenge) do |f| %>
  <%= f.text_field :action %>
  <%= f.submit %>
<% end %>

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

<%= form_for(@challenge) do |f| %>
  <%= f.text_field :action %>
  <%= f.date_select :deadline %>
  <%= f.check_box :conceal %>
  <%= f.submit %>
<% end %>

一旦他添加了这些详细信息并单击 "Save" 我希望通过 challenges_controller 的创建操作创建挑战。

def step_one
  ??
end

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

答案更有可能 "it depends what you are trying to do",但最简单的解决方案是重定向(在保存后创建)到包含所有或其他字段的编辑 action/view,而不仅仅是有限的字段您在新 action/view.

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

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

完成此操作最简单且最 "Rails"y 的方法是接受来自您的第一个请求的传入 "name" 属性,并呈现第二阶段表单,并将名称保留为隐藏字段。

app/controllers/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

app/views/challenges/new.html.erb

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

app/views/challenges/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 不同的形式。这对于 Rails 应用程序来说是非典型的
  • create 呈现的 "step 2" 表单使用 hidden_field_tag 为提交附加一个额外的值,params[:challenge] 属性之外
  • 验证未处理 - 如果有人在步骤 1 中提交了一个空名称,或者在步骤 2 中提交了其他无效属性,则由您来显示错误