fullstack-course 8/11

技术知识

  • 在heroku报错如何查看错误?
    可以在iterm里面用命令“heroku log”查看错误

  • 如何用“作弊”的手法新建admin?
    可以先在migration改栏位(新建一个migration,change_column,记住不是add_column),将is_admin的default改为true。这样新注册的用户就都是admin了。
    之后再改栏位,将default改回来。方法同上。
    ps:因为是部署到heroku,所以执行完操作后都要记得push到heroku,当设计资料库变更时,还要运行heroku run rake db:migrate

  • controller里面加不加@的问题
    加@是要在view里引用的情况,如果是只在controller里面直接调用,不用加@

  • 订单管理的!和?
    有限状态机里面的动作(如取消)都需要加!,因为都是改变自身的状态。
    如果是返回是true或者false的后面一定要加?
    注意:

    ①有限状态机的“取消”只能取消一次,不能重复取消。

    ②有限状态机是有存在逻辑的,from···to···,这个需要注意一下

  • 发送邮件的一个问题
    在rails c中,发送文件的命令是这样的OrderMailer.notify_order_cancelled(Order.last).deliver!,而在controller里面要改一下。

    def cancel
      @order = Order.find(params[:id])
      OrderMailer.notify_order_cancelled(@order).deliver!
      @order = @order.cancell_order!
      redirect_to :back
    end
    

    Order.last改成了@order。理由:在rails c中,Order.last是去取最近的一个order,而在controller中,因为已经找到order并且赋值到变数@order了,所以直接引用@order就可以了。

  • 发送邮件的另一个问题

    def cancel
      @order = Order.find(params[:id])
      OrderMailer.notify_order_cancelled_by_admin(@order).deliver!
      @order = @order.cancell_order!
      redirect_to :back
    end
    

    OrderMailer.notify_order_cancelled_by_admin(@order).deliver!这行代码不能放在@order = @order.cancell_order!后面,因为@order = @order.cancell_order!有一个取消订单的动作,所以不合逻辑。发出邮件这个指令应该直接跟在找到order并赋值到@order这行命令下面。

  • 加标签进行有限状态机管理订单的方法
    最重要的是orders_helper.rb里面的这段代码。有两种方法可以使用(其实用hash也可以)。

    第一种:

    def render_order_state(order)
      case order.aasm_state
      when "order_placed"
        content_tag("span","已下单", class:"label label-default")
      when "paid"
        content_tag("span","已支付", class:"label label-default")
      when "shipping"
        content_tag("span","发货中", class:"label label-default")
      when "shipped"
        content_tag("span","已发货", class:"label label-default")
      when "order_cancelled"
        content_tag("span","已取消", class:"label label-default")
      when "good_returned"
        content_tag("span","已退货", class:"label label-default")
      end
    end
    

    第二种:

    def render_order_state_if(order)
      if order.paid?
        content_tag("span", "已支付", class:"label label-default")
      elsif order.order_placed?
        content_tag("span", "已下单", class:"label label-default")
      elsif order.shipping?
        content_tag("span", "发货中", class:"label label-default")
      elsif order.shipped?
        content_tag("span", "已发货", class:"label label-default")
      elsif order.order_cancelled?
        content_tag("span", "已取消", class:"label label-default")
      elsif order.good_returned?
        content_tag("span", "已退货", class:"label label-default")
      end
    end