【问题标题】:Rails 4: Maintain form inputs after validationRails 4:验证后维护表单输入
【发布时间】:2017-04-13 13:20:03
【问题描述】:

我的Locations#show 视图上有一个用于不同型号 (PotentialClient) 的表单。当我的表单验证失败时,重定向会清空所有字段,因为我需要初始化一个新的 potential_client 以加载视图。

如何更改此设置,以便在验证失败后填充字段?

# LocationsController
def show
    @potential_client = PotentialClient.new
end

# class PotentialClient < ActiveRecord::Base
validates_presence_of :name, :email, :phone

# PotentialClientsController
def create
    @potential_client = PotentialClient.new(potential_client_params)
    respond_to do |format|
        if @potential_client.save
            format.html { redirect_to Location.find(@potential_client.location_id), notice: 'Success!' }
        else
            format.html { redirect_to Location.find(@potential_client.location_id), notice: 'Failure!' }
        end
    end
end

# Form in /locations/show
<%= simple_form_for [ @location, @potential_client ] do |f| %>

    <%= f.input :name %>
    <%= f.input :email %>
    <%= f.label :phone %>
    <%= f.input :message %>
    <%= f.hidden_field :location_id, value: @location.id %>

    <%= f.submit "Submit" %>

<% end %>

【问题讨论】:

    标签: ruby-on-rails validation ruby-on-rails-4


    【解决方案1】:

    由于您正在重定向到另一个页面,浏览器将发送新请求。所以服务器不会知道先前请求中发生了什么。您需要使用会话在请求之间共享数据

    def show
      @potential_client = session[:potential_client] || PotentialClient.new
    end
    
    
    # PotentialClientsController
    def create
      @potential_client = PotentialClient.new(potential_client_params)
      respond_to do |format|
        if @potential_client.save
          format.html { redirect_to Location.find(@potential_client.location_id), notice: 'Success!' }
        else
          session[:potential_client] = @potential_client
          format.html { redirect_to Location.find(@potential_client.location_id), notice: 'Failure!' }
        end
      end
    end
    

    【讨论】:

    • 为了完成这项工作,我还将LocationsController 中的行从@potential_client = PotentialClient.new 更改为@potential_client = session[:potential_client] || PotentialClient.new。如果您将其添加到您的回复中,我会将其标记为正确
    • 我还建议将Location.find(@potential_client.location_id) 更改为@potential_client.location,这样会更短且更清晰。第二件事:如果你只响应 html,respond_to 块可能是多余的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多