我正在视图页面上进行验证,因为我没有将它存储在数据库中。因此,我无法使用模型验证。我不得不资源使用JavaScript来检查验证,以确保用户没有提交错误的值或提交所需的空字段。这确实可以防止用户提交错误的输入,但是在弹出错误警告框之后它会因某种原因禁用提交按钮,用户无法修复他的错误并尝试再次提交。
feedback.html.erb
<script>
function validateForm() {
if (document.forms["myForm"]["name"].value == null || document.forms["myForm"]["name"].value == "") {
alert("Name must be filled out");
return false;
}
if (document.forms["myForm"]["message"].value == null || document.forms["myForm"]["message"].value == "") {
alert("Message must be filled out");
return false;
}
var x = document.forms["myForm"]["email"].value;
var atpos = x.indexOf("@");
var dotpos = x.lastIndexOf(".");
if (atpos < 1 || dotpos < atpos+2 || dotpos+2 >= x.length) {
alert("Not a valid e-mail address");
return false;
}
}
</script>
<div class="container">
<div class="container-content">
<%= form_tag send_feedback_forms_path, name:'myForm', onsubmit:'return validateForm()' do %>
<%= label_tag 'name', 'Name:', class: 'control-label' %>
<%= text_field_tag 'name', nil, placeholder: 'Enter Your Name', class:'form-control' %>
<%= label_tag 'text', 'Email:', class: 'control-label'%>
<%= email_field_tag 'email', nil, placeholder: 'Enter Your Email', class:'form-control' %>
<%= label_tag 'phone', 'Phone:', class: 'control-label'%> <span style="font-size: small; color: red">(optional*)</span>
<%= phone_field_tag 'phone', nil, placeholder: 'Enter Your Phone Number', class:'form-control' %>
<%= label_tag 'message', 'Message:', class: 'control-label' %>
<%= text_area_tag 'message', nil, placeholder: 'Enter Your Message', class:'form-control' %><br>
<%= submit_tag 'Submit', class: 'btn-primary' %>
<% end %>
</div>
</div>
答案 0 :(得分:1)
您使用javascript的全部原因是基于您不能使用模型的前提,因为它们不会被持久存储到数据库中,所以我觉得有必要给你一个Rails替代。您要做的是设置一个&#34;表单模型&#34;。这允许您使用所有Rails魔术,而不需要表支持任何数据。所有这些都需要创建一个类,添加一些虚拟属性,然后包含一些Rails模块,你就可以了。示例如下:
#app/models/new_user.rb
class NewUser
include ActiveModel::Model #This gives you validations and all the rails magic a standard table backed model would
attr_accessor :email #This gives you read&write methods for your virtual attribute
attr_accessor :username
validates :username, :email, presence: true #standard rails validations
def initialize(params={})
self.username = params[:username]
self.email = params[:email]
end
end
现在在您的控制器中,您需要为视图实例化对象:
def new
@new_user = NewUser.new
end
然后在表单提交的操作中,由于您没有持久保存任何数据,您需要检查它是否有效:
def create
@new_user = NewUser.new(email: params[new_user][:email], username: params[:new_user][:username])
if @new_user.valid?
#passed validation so do whatever
else
#flash some errors etc
end
end
随着您继续开发更大的Rails应用程序。您会注意到,一个模型可能必须处理不同页面上的许多不同形式,这些形式都需要不同数量的数据。在这一点上,处理一个模型的所有许多不同形式的所有验证都成了灾难。上述方法允许您在表单的基础上组织代码而不受限制。