在 Rails 中隐藏按钮(Agile Web Development with Rails 书)
Posted
技术标签:
【中文标题】在 Rails 中隐藏按钮(Agile Web Development with Rails 书)【英文标题】:Hiding button in rails (Agile Web Development with Rails book) 【发布时间】:2012-11-13 18:28:02 【问题描述】:这是我的第一个问题,所以我希望我可以尽可能具体,但不要太苛刻。
我正在使用 Rails 进行敏捷 Web 开发,并且对编程非常陌生。
当我在订单/新页面上时,我想隐藏一个“结帐”按钮,这样它就不会对用户购买造成任何不良影响。
目前,我并不真正了解实例变量是如何工作的,因为似乎无论我在哪里声明我的实例变量,在视图中或在 orderscontroller#new 中,它总是验证为真。
这似乎是因为当我在视图中使用实例变量来隐藏 div 时(使用 hidden_div_if(condition == true) )按钮总是被隐藏!
不仅如此,当我这样做时:
<%= hidden_div_if( @hide_checkout_button == false ) do %>
<td><%= button_to 'Empty cart', cart, :method => :delete,
:confirm => 'Are you sure?' %></td>
<% end %>
<%= hidden_div_if( @hide_checkout_button == true ) do %>
<td><%= button_to "Checkout", new_order_path, :method => :get %></td>
<% end %>
两个按钮都被隐藏了!怎么可能!?!
在这个例子中,我把变量声明放在了views\orders_form.html.erb:
<%= @hide_checkout_button = true %>
<%= form_for(@order) do |f| %>
<% if @order.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@order.errors.count, "error") %>
prohibited this order from being saved:</h2>
<ul>
<% @order.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
...
这是一个讨论论坛,其中包含此问题的解决方案,但它们对我不起作用,我不知道为什么:http://pragprog.com/wikis/wiki/Pt-G-2/version/35
这是问题本身:
如果您点击侧边栏中的“结帐”按钮,而 结帐屏幕已经显示?你能找到一种方法来禁用 在这种情况下的按钮? (提示:控制器中设置的变量 可用于布局和局部以及直接渲染 模板。)
如果您需要更多信息来提供帮助,请询问,我不太确定要提供多少细节或哪些信息很重要。
提前致谢:-)
def new
@cart = current_cart
if @cart.line_items.empty?
redirect_to store_url, :notice => "Your cart is empty"
return
end
puts 34
@hide_checkout_button = true
@order = Order.new
puts 37
respond_to do |format|
format.html # new.html.erb
format.json render json: @order
end
end
于 2012-11-13 20:33:40 +0000 开始为 127.0.0.1 获取“/assets/logo.png” 服务资产 /logo.png - 304 未修改(1 毫秒) [2012-11-13 20:33:40] WARN 无法确定响应正文的内容长度。 设置响应的内容长度或设置 Response#chunked = true * 34 37 * /订单/新
于 2012 年 11 月 13 日 20:33:49 +0000 开始为 127.0.0.1 获取“/orders/new” OrdersController#new 作为 HTML 处理 ←[1m←[36mCart Load (1.0ms)←[0m ←[1mSELECT "carts".* FROM "carts" WHERE "carts "."id" = ? LIMIT 1←[0m [["id", 63]] ←[1m←[35m (1.0ms)←[0m SELECT COUNT(*) FROM "line_items" WHERE "line_items"."c art_id" = 63
【问题讨论】:
只是一块小骨头可供挑选。敏捷是一种开发方法,而不是 Rails 技术。它决定了您如何处理开发问题,但与您提供的代码为什么可以工作或不工作没有任何关系:)。 提示也不是 100% 准确:instance variables
可用,local variables
不可用
@gbt,它的书名(这就是它大写的原因)不是我的描述 - 感谢您的评论
【参考方案1】:
问题是缺少=
。改为<%= %>
。
<%= hidden_div_if( @hide_checkout_button == true ) do %>
<td><%= button_to "Checkout", new_order_path, :method => :get %></td>
<% end %>
此外,对于布尔检查,您只需执行 if(boolean)
,其评估结果与您输入 ==
true
/false
的结果相同
<%= hidden_div_if( @hide_checkout_button) do %>
#...
<% end %>
您想在调用视图的方法上设置该变量。在这种情况下,它是OrdersController
中的new
方法
def new
@hide_checkout_button = true
end
编辑:
将其添加到隐藏的 div 中只是为了查看它是否有助于找到将属性设置为的元素
<%= hidden_div_if(@hide_checkout_button, id: 'cart') do %>
with(在应用程序助手中)
def hidden_div_if(condition, attributes = , &block
if condition
attributes["style"] = "display: none"
end
content_tag("div", attributes, &block)
end
如果不这样做,那么就这样做
<% if @hide_checkout_button %>
<td><%= button_to "Checkout", new_order_path, :method => :get %></td>
<% else %>
<td><%= button_to 'Empty cart', cart, :method => :delete, :confirm => 'Are you sure?' %></td>
<% end %>
【讨论】:
您好,感谢您的回复,这 = 让他们俩都出现了。我承认这是一个错误,但我做错了其他事情。我在 orderscontroller#new 和按钮周围的 hidden_div_if 方法中有实例变量。但在我“获取”new_order_path 后,“结帐”按钮在结帐页面中仍然可见new_order_path
将点击new
方法然后视图。要测试您是否有正确的值,请在 div 之前的视图中打印它。显示该方法。
config/routes.rb
中有resources orders
。您不能忽略该错误消息。这意味着它没有找到路径。【参考方案2】:
二手
<div class="actions">
<% if not @hide_checkout_button %>
<%= button_to 'Checkout', new_order_path, method: :get, class: "checkout" %>
<% end %>
<%= button_to 'Empty cart', cart, method: :delete, data: confirm: "Are you sure?" , remote: true %>
【讨论】:
以上是关于在 Rails 中隐藏按钮(Agile Web Development with Rails 书)的主要内容,如果未能解决你的问题,请参考以下文章
使用 js/jquery 在 ruby on rails 中隐藏 form_tag 上的提交按钮
Rails,如果多个文本框为空,如何隐藏/显示按钮? [关闭]