我采用以下表格将某人添加到候补名单中。
<%= form_with(model: waitinglist, url: '/join', local: true) do |form| %>
<div class="field">
<%= form.text_field :email %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
这可以正常工作,它将发布人员并将其添加到等待列表中。但是,当页面重新加载时,表单会进入某种自动资源模式,在这种模式下,提交按钮会发生神奇的变化以进行更新,然后表单会神奇地更改为HTTP Patch方法。
我试图了解正在执行的操作,但是我在文档中找不到任何内容。
我如何创建一个常规表单,该表单仅发布到终点但仍可验证模型? (并删除此更新功能)。
编辑添加的控制器
class WaitinglistsController < ApplicationController
before_action :set_waitinglist, only: [:show, :edit, :update, :destroy]
# GET /waitinglists/new
def new
@waitinglist = Waitinglist.new
end
# POST /waitinglists
# POST /waitinglists.json
def create
@waitinglist = Waitinglist.new(waitinglist_params)
if @waitinglist.save
flash[:notice] = "You have been added to the waiting list"
render :new
else
render :new
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_waitinglist
@waitinglist = Waitinglist.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def waitinglist_params
params.require(:waitinglist).permit(:email)
end
end
答案 0 :(得分:1)
您要在两次页面加载之间保留持久的等待列表变量的副本。当第二次呈现新页面时,由于等待列表已被保留,因此它将执行所有神奇的默认Rails行为,其中包括更新提交按钮的标签(创建或更新)以及表单的方法(发布与补丁)。
如果您要重新呈现新页面,则需要创建一个新的等待列表:
def create
@waitinglist = Waitinglist.new(waitinglist_params)
if @waitinglist.save
@waitinglist = Waitinglist.new #
flash[:notice] = "You have been added to the waiting list"
render :new
else
render :new
end
end
答案 1 :(得分:0)
我认为您应该做的是,如果保存了等待列表,请重定向到new而不是render new。当您重定向到动作时,它将调用该动作,因此将创建一个新对象。当您进行渲染时,将渲染视图,而我将拥有您的持久对象,这就是为什么它试图更新的原因。