如何禁用rails form_with更新功能

时间:2019-09-06 04:37:14

标签: ruby-on-rails

我采用以下表格将某人添加到候补名单中。

<%= 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

2 个答案:

答案 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。当您重定向到动作时,它将调用该动作,因此将创建一个新对象。当您进行渲染时,将渲染视图,而我将拥有您的持久对象,这就是为什么它试图更新的原因。