Rails控制器new操作分两页,保存失败时如何渲染第二页而非第一页?
问题解决方法
你之前的写法错误原因是:render 方法接收的参数为视图模板的文件路径,而非路由URL,你传入带查询参数的字符串时,Rails会将整个字符串作为模板文件名查找,自然会触发Missing template报错。
实现方案
- 补充第二页表单隐藏字段
在第二页的表单中添加两个隐藏字段,把customer_id和source_content_text_id参数随表单一起提交到create动作:
<%= hidden_field_tag :customer_id, params[:customer_id] %> <%= hidden_field_tag :source_content_text_id, params[:source_content_text_id] %>
- 调整new动作分支逻辑
在new动作中根据是否存在customer_id参数,区分渲染第一步/第二步内容,你可以选择拆分两个独立模板,也可以直接在new.html.erb中加逻辑分支:
def new @source_content_text = SourceContentText.find(params[:source_content_text_id]) if params[:customer_id].present? # 存在customer_id,走第二步逻辑 @customer = Customer.find(params[:customer_id]) @content_text = ContentText.new(customer: @customer, source_content_text: @source_content_text) # 如果拆了单独的第二步模板就指定渲染,没拆就不用写,默认渲染new模板即可 # render :new_step2 else # 不存在customer_id,走第一步选客户逻辑 @customers = Customer.all # 替换为你实际的客户查询逻辑 # render :new_step1 end end
对应new.html.erb的分支示例:
<% if params[:customer_id].present? %> <!-- 第二步填写其他信息的表单代码 --> <% else %> <!-- 第一步选择客户的表单代码 --> <% end %>
- 修改create动作失败后的渲染逻辑
保存失败时,只要确保模板需要的实例变量已正确赋值,直接渲染模板即可:
def create @content_text.content_area = @source_content_text.content_area if @content_text.save redirect_to [@content_text], notice: 'Content Text was successfully created.' else # 手动赋值第二步模板需要的变量,确保渲染时参数正确 @customer = @content_text.customer @source_content_text = @content_text.source_content_text # 如果拆分了第二步模板就写render :new_step2,没拆分就直接render :new render :new end end
内容的提问来源于stack exchange,提问作者kdweber89
相关产品推荐
相关产品推荐

