ruby-on-rails - 在嵌套表单的表单中显示错误消息?
问题描述
问题:我有一个使用嵌套资源的表单,由于某种原因,没有像在我的其他表单中那样出现错误消息。
这是我的表格:(简而言之)
<%= form_for(@order, url: listing_orders_path([@listing, @listing_tweet]), remote: true) do |form| %>
<% if @order.errors.any? %>
<ul>
<% @order.errors.full_messages.each do |msg| %>
<div class="alert alert-danger alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<%= msg %>
</div>
<% end %>
</ul>
<% end %>
<div class="form-group">
<%= form.label :twitter_link, "Twitter Link" %>
<%= form.text_field :twitter_link, class: "form-control", required: true %>
</div>
<% form.hidden_field :order_type, value: 2 %>
<%= form.submit %>
<% end %>
order.rb 模型:
validates :twitter_link, format: { with: /\A((http|https):\/\/)?(www.)?twitter.com\//,
message: "use a valid twitter url" }
验证本身正在工作,只是消息不会出现。
问题:如何更正我的 html 或任何其他代码以显示错误消息?
这个想法是,如果 URL 不包含或不以 twitter.com 开头,则应该出现错误消息。
我在其他表单中使用了这个确切的错误代码,但唯一的区别是这个表单使用的是嵌套资源。所以我尝试过做类似的事情
if @order([@listing, @listing_tweet]) 等(其他类似的组合)但没有一个允许页面加载。我认为@order 应该可以正常工作,因为那是提交的地方
作为对可能重复的解释......我的验证错误消息根本没有出现。“可能重复”的问题是指它们的错误消息的顺序。
我将在下面展示我的代码在哪里工作,然后在哪里不工作 [使用嵌套资源]
形式:
<%= form_for([@listing, @listing_tweet]) do |form| %>
<% if @listing_tweet.errors.any? %>
<ul>
<% @listing_tweet.errors.full_messages.each do |msg| %>
<div class="alert alert-danger alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<%= msg %>
</div>
<% end %>
</ul>
<% end %>
<div class="row">
<div class="field col-10">
<%= form.text_field :price, class: "form-control" %>
<%= form.label :price %>
</div>
<br>
<div class="actions col-2">
<%= form.submit "Submit", class: "btn btn-success" %>
</div>
<% end %>
</div>
</div>
上市推文模型:
validates :price, :numericality => {:only_integer => true, greater_than_or_equal_to: 5, message: "must be great than or equal to $5" }
当 text_field 输入未验证时,上面的代码会生成错误消息
这与我遇到问题的表单之间的区别在于它是一个双嵌套表单。除了“双嵌套”之外,不知道如何解释,但您可以看到上面的区别。
控制器中的两个 create 方法都使用这种格式:
else
format.html { render :new }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
更新:
我在想这可能是我的 create 方法的问题,因为我使用了 valid?在启动我的收费代码之前和雷提到它之后......
简而言之,这是我的创作:
def create
@order = Order.new(order_params)
@listing = Listing.find(params[:listing_id])
#more code here
if @order.valid?
begin
###stripe code here to create charges
rescue Stripe::CardError => e
charge_error = e.message
end
if charge_error
flash[:error] = charge_error
redirect_to listing_path(@listing)
else
respond_to do |format|
if @order.save
@order.update_column(:order_status, 1)
if user_signed_in?
# @user = current_user
# OrderMailer.order_email(@user, @order).deliver
format.html { redirect_to @order, notice: 'Order was successfully created.' }
format.json { render :show, status: :created, location: @order }
else
format.html { render :new }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
end
end
end
end
end
create 方法中是否存在导致验证错误消息不出现的问题?
解决方案
推荐阅读
- typescript - 如何在打字稿中调用具有多种类型数组的地图函数
- javascript - 谷歌表格 - 优化在一定范围内创建笔记的功能(非常慢)
- php - 完整地址 $_SERVER["HTTP_REFERER"];
- machine-learning - 无论输入如何,我的 RandomForest 都会为 model.predict_proba() 返回完全相同的概率
- sql - Oracle SQL 数据库内存中 - 比较压缩大小
- python - asyncio:发生异常时如何对对象进行排队
- python - 使用 colab 从内存中读取 .csv 文件
- arrays - 在C中循环遍历二维字符数组的正确方法
- postgresql - 身份验证问题 (KRB5\GSS)
- python - 按值和大小的递增顺序对嵌套的数字列表进行排序