我正在开发一个带有rails 4书籍的敏捷Web开发的在线商店网站,我对Rails很陌生。
下面是我的_line_item.html.erb模板,在侧栏中呈现为购物车。
<% if line_item == @current_item %>
<tr id="current_item">
<% else %>
<tr>
<% end %>
<td><%= line_item.quantity %>×</td>
<td><%= line_item.product.title %></td>
<td class="line_item_price" align="right">
<%= number_to_currency(line_item.total_price) %>
</td>
<% if !session[:cart_id].nil? %>
<td><%= button_to "X", line_item, method: :delete, remote: true,
:disabled => !@order.nil? %></td>
<% end %>
</tr>因此,当用作侧边栏时,它的工作非常好。但是我也想使用模板来确认电子邮件,但显然我不希望那些X按钮出现在那里,所以我在button_to助手之外添加了一个if条件。我以为它会起作用,因为在我的orders_controller.rb里,
......
def create
@order = Order.new(order_params)
@order.add_line_items_from_cart(@cart)
*LINE38* respond_to do |format|
if @order.save
Cart.destroy(session[:cart_id])
session[:cart_id] = nil
*LINE42* OrderNotifier.received(@order).deliver
......如果创建操作成功,我将session:cart_id设置为零。如果我不使用_line_item.html.erb作为模板,一切正常工作,订单被创建,电子邮件被发送,因为没有按钮问题。但是如果这样做,在触发orders_controller.rb的创建操作之后,浏览器会为#orders_controller.rb声明“未定义的方法‘会话”。
所以,我的问题是,如果方法或其他什么是未定义的,不是零吗?这里的根本问题是什么,以及如何按照我预期的方式解决它?
你可以去http://online-bookstore.herokuapp.com/查看网站,但是FYI,电子邮件发送部分并没有被部署在那里,所以当它说“感谢您的订单”时,它不会发送电子邮件。
这是我在邮件中的order_notifier.rb /
......
def received(order)
@order = order
*LINE23* mail to: order.email, subject: 'Your Order Confirmation'
end
......以及错误信息:
Showing /home/jeremy/online-store/app/views/line_items/_line_item.html.erb where line #9 raised:
undefined method 'session' for #<OrderNotifier:0x007ff296453108>
Extracted source (around line #9):
<td><%= line_item.quantity %>×</td>
<td><%= line_item.product.title %></td>
<td class="line_item_price" align="right"><%= number_to_currency(line_item.total_price) %></td>
*LINE9* <% if !session[:cart_id].nil? %>
<td><%= button_to "X", line_item, method: :delete, remote: true,
:disabled => !@order.nil? %></td>
<% end %>
Trace of template inclusion: app/views/order_notifier/received.html.erb
Rails.root: /home/jeremy/online-store
Application Trace | Framework Trace | Full Trace
app/views/line_items/_line_item.html.erb:9:in '_app_views_line_items__line_item_html_erb___1832667105729053783_70339760911020'
app/views/order_notifier/received.html.erb:8:in '_app_views_order_notifier_received_html_erb__517934132095274867_70339761303220'
app/mailers/order_notifier.rb:23:in 'received'
app/controllers/orders_controller.rb:42:in 'block in create'
app/controllers/orders_controller.rb:38:in 'create'非常感谢你的帮助!!
发布于 2014-09-07 05:39:18
不能在session类中使用OrderNotifer。session仅在控制器和视图的上下文中可用。但是您可以将该session传递给您的Mailer并使其在那里可用。
# change the line in your controller where you create you Mailer
OrderNotifier.received(@order, session).deliver
# change order_notifier.rb
def received(order, session)
@order = order
@session = session
...
# change to line that currently raises the exception to
<% if @session[:cart_id] %>这使得整个session对象作为@session在邮件和邮件视图中可用。这不是最好的实践,但应该立即解决你的问题。
如果您只需要视图中的card_id,那么最好将该值传递给您的视图:
# in controller
OrderNotifier.received(@order, session[:card_id]).deliver
# in mailer
def received(order, card_id)
@order = order
@card_id = card_id
...
# in mailer view
<% if @cart_id %>https://stackoverflow.com/questions/25706508
复制相似问题