howto:具有多个模型的表单 - 错误后重新呈现表单(填充的字段)

时间:2018-04-14 09:09:15

标签: ruby-on-rails

我有一个向导,保存在3个模型中,所以对于输入我使用了带有text_fields的form_tab,radio_buttons ......除了验证之外它很有效:当我失败时我使用redirect_back fallback_location驱回我的向导...但是我的表格为空白,用户输入以前输入的值。

问题: - 使用form_tag是否可以(我有3个型号而不是简单的录音 - 如何“保存”或放回以前输入的值?

谢谢,

格雷格

我的回程循环:

return redirect_to home_wizard_path, notice: @user.errors.full_messages.join(',')

或者,同样的结果:

return redirect_back fallback_location: home_wizard_path, notice: @user.errors.full_messages.join(',')

以我的形式:

<%= form_tag(wizard_post_path, method: :post) do %>
<div class="input-field col s6">
      <%= text_field_tag('nom') %>
      <%= label_tag('nom', 'Nom') %>
</div>

2 个答案:

答案 0 :(得分:1)

我只是试图展示使用Simple_form并为您创建快速表单。请参阅在此简单表单中添加其他标记。

将其添加到您的Gemfile:

gem 'simple_form'

运行以下命令进行安装:

bundle install

运行生成器:

rails generate simple_form:install

在users_controller.rb

class UsersController < ApplicationController

    def new
     @user = User.new
    end  

    def create
      @user = User.new(user_params)
      if @user.valid?

      else
        render :new
      end    
    end

    private
    def user_params
      params.require(:user).permit(:user_name)
    end
end

在new.html.erb。

<div class="row">
   <div class="col-md-6">
    <%= simple_form_for @user, class: 'form-horizontal' do |f| %>
        <%= f.input :user_name %>

        <br/>
        <%= f.button :submit %>
    <% end %>
   </div>
</div>

答案 1 :(得分:1)

答案

如果您的表单与模型直接绑定,则在大多数情况下,最好使用表单助手form_for

回答有关重新填充表单和呈现错误的问题。您应该 redirect_back,因为这会导致当前值丢失。而是再次渲染相同的页面。这将允许表单访问以前的结果,并用它们填写表单。这在使用form_for帮助程序时自动发生(如果您更新了模型实例的属性)。

如果您无法使用form_for帮助程序并使用单独的标记,请不要忘记设置值。 <%= text_field :object_name, :attribute_name, value: object.attribute %>如果未设置该值,则会生成空文本字段,否则将填充属性值。

有一些助手使表单创建更容易一些。例如Simple FormFormtastic但我至少会建议您首先查看有关表单的Rails指南:Action View Form Helpers

实施例

一个很好的例子,是脚手架模型的结果。您最终在控制器中使用以下代码:

class ChairsController < ApplicationController
  # ...

  def new
    @chair = Chair.new
  end

  def create # I removed the json parts
    @chair = Chair.new(chair_params)

    if @chair.save
      redirect_to @chair, notice: 'Chair was successfully' 
    else
      render :new
    end
  end

  # ...
end

使用chairs/new视图连接以下行:

<%= form_for @chair do |form| %>
  <% if @chair.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@chair.errors.count, "error") %> prohibited this chair from being saved:</h2>

      <ul>
      <% @chair.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :name %>
    <%= form.text_field :name, id: :chair_name %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>