首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于# OrderNotifier的Rails未定义方法“会话”

用于# OrderNotifier的Rails未定义方法“会话”
EN

Stack Overflow用户
提问于 2014-09-07 02:16:20
回答 1查看 591关注 0票数 0

我正在开发一个带有rails 4书籍的敏捷Web开发的在线商店网站,我对Rails很陌生。

下面是我的_line_item.html.erb模板,在侧栏中呈现为购物车。

代码语言:javascript
复制
<% if line_item == @current_item %>
    <tr id="current_item">
<% else %>
    <tr>
<% end %>
        <td><%= line_item.quantity %>&times;</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里,

代码语言:javascript
复制
    ......
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 /

代码语言:javascript
复制
......
def received(order)
  @order = order

  *LINE23* mail to: order.email, subject: 'Your Order Confirmation'
end
......

以及错误信息:

代码语言:javascript
复制
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 %>&times;</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'

非常感谢你的帮助!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-07 05:39:18

不能在session类中使用OrderNotifersession仅在控制器和视图的上下文中可用。但是您可以将该session传递给您的Mailer并使其在那里可用。

代码语言:javascript
复制
# 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,那么最好将该值传递给您的视图:

代码语言:javascript
复制
# 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 %>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25706508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档