![](/img/trans.png)
[英]submit a remote form_tag in rails 3 using javascript but submits as html
[英]Submit button stops working in rails when using javascript to validate input fields when using form_tag
我正在视图页面上进行验证,因为我没有将其存储在数据库中。 因此,我不能为此使用模型验证。 我不得不使用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>
您使用javascript的全部原因是基于您不能使用Models的前提,因为Models不能持久化到数据库中,因此我不得不为您提供Rails替代方案。 您要做的是设置一个“表单模型”。 这使您可以使用所有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应用程序。 您会注意到,一个模型可能必须在不同的页面上处理许多不同的形式,而所有这些形式都需要不同的数据量。 在这一点上,为一个模型处理所有许多不同形式的所有验证就变成了灾难。 上面的方法将使您可以逐个表单地组织代码,而不受限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.