使用rails

时间:2016-12-23 15:54:37

标签: ruby-on-rails forms devise simple-form

我添加了自定义字段来设计注册表单:单选按钮和选择列表我遇到的问题是,如果在验证数据时出现错误(例如用户写错了密码),我将被重定向到注册表单,自定义字段将丢失数据。 这两个图片解释了这个例子:

Before submitting data

After submitting data

在两张图片中,用户应再次点击单选按钮选择一个值,通常应该通过设计保存在会话中。

new.html.erb

<h2>Sign up</h2>

<%= simple_form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
    <%= f.error_notification %>

    <div class="form-inputs">
      <%= f.input :user_type, as: :radio_buttons, collection: %w(personnal professional), checked: 'personnal' %>
      <%= f.input :name, required: true %>
      <%= f.input :city,as: :select,required: true,%>
      <%= f.input :email, required: true %>
      <%= f.input :password, required: true, hint: ("#{@minimum_password_length} characters minimum" if @minimum_password_length) %>
      <%= f.input :password_confirmation, required: true %>
    </div>

    <div class="form-actions">
      <%= f.button :submit, "Sign up" %>
    </div> <% end %>

<%= render "devise/shared/links" %>

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name,:city,:user_type,:phone])
  end
end

User.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

我在这里找到了stackoverflow的一个解决方案,但是我不能让它与设计一起工作我已经生成了设计控制器,但解决方案对我来说不起作用。 Keep form fields filled after an error (RoR)

1 个答案:

答案 0 :(得分:2)

问题与您提供链接的问题无关。您在表单中明确设置了user_type参数的值,但您不应该这样做。

更改

<%= f.input :user_type, as: :radio_buttons, collection: %w(personnal professional), checked: 'personnal' %>

<%= f.input :user_type, as: :radio_buttons, collection: %w(personnal professional) %>

该参数将根据resource自动设置。提交表单时,参数应保持原样。

如果要设置默认值,可以这样做:

<%= f.input :user_type, as: :radio_buttons, collection: %w(personnal professional), checked: resource.user_type || 'personnal' %>

不是最好的方式,但最简单。