我会通过构建一个包含所有元素的表单来解决这个问题,将其放在一个部分中,并将其包含在所有登录页面上。然后在每个登录页面的单独样式表中,隐藏您不想在该特定页面上使用的所有元素。
要解决验证的潜在问题(例如,您需要验证是否在请求时提供了密码),您可以创建一个配置文件(例如config/initializers/landing_forms.rb
),您可以在其中指定要包含在每个表单字段中的表单字段,然后从该文件生成适当的 CSS并在您的验证中使用它,即:
登陆表格.rb
YourInitializer = {
foo: [:email, :password],
bar: [:email, :name, :address],
baz: [:name, :phone]
}.with_indifferent_access.freeze
_form.html.erb
<%= form_for ... do |f| %>
<%= f.hidden_field_tag :landing_page_id, value: 'foobar' %>
<% end %>
控制器
class UsersController < ApplicationController
def create
@user = User.new(params[:user])
User.validate_only requested_fields
# ...
end
protected
def requested_fields
YourConfig.fetch params[:landing_page_id]
end
end
模型
class User < ActiveRecord::Base
attr_reader :required_validations
validate :email, presence: true, if: :email_required?
def email_required? # feel free to use a bit of metaprogramming to make this simpler
required_validations.include? :email
end
def validate_only(fields)
@required_validations = fields
end
end
page_forms.css.erb
/* Hide all non-button inputs by default, then show individually */
<% YourConfig.each_pair do |landing_page_id, fields| %>
<% fields.each do |field| %>
#<%= landing_page_id %> form .<% field %> { display: block }
<% end %>
<% end %>
希望这足以让你开始!