第二步_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 中提交了其他无效属性,则由您来显示错误
所以在第一步中,用户创建了他的挑战。
<%= 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 中提交了其他无效属性,则由您来显示错误