代码之家  ›  专栏  ›  技术社区  ›  Maayan Naveh

读取cookies的Rails返回一个字符串而不是一个对象

  •  0
  • Maayan Naveh  · 技术社区  · 6 年前

    我有两个控制器。我的 Sellers controller 设置和读取cookie很好。 在我的 Titles Controller ,尝试读取cookie会导致返回字符串,而不是对象。 所以, cookies[:user].id 在中工作 Sellers Controller ,但在 标题控制器 它返回一个错误: undefined method 为“”购买“名称”:字符串`

    卖家控制器代码如下:

    class SellersController < ApplicationController
      before_action :set_cookies
    
      def show
        @seller = Seller.find(params[:id])
        @user = cookies[:user]
        @shop = cookies[:shop]
        @listings = Listing.where(shop: @shop).paginate(page: params[:page])
      end
    
      private
        def set_cookies
          cookies[:user] = current_user
          cookies[:seller] = Seller.find(params[:id])
          cookies[:shop] = Shop.where(seller: cookies[:seller]).first
        end
    end
    

    这是我的 Titles Controller:

    class TitlesController < ApplicationController
      before_action :find_data
    
      def index
        @titles = Title.last
      end
    
      private
        def find_data
          @shop = cookies[:shop]
          @seller = cookies[:seller]
          @user = cookies[:user]
        end
    end
    

    检查调试器中的变量可以得到以下输出:

    @shop
    => "#<Shop:0x00007f433f785dc8>"
    >> 
    @shop.inspect
    => "\"#<Shop:0x00007f433f785dc8>\""
    >> 
    cookies[:shop].class
    => String
    

    我在这里做错什么了吗? 谢谢!

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jay-Ar Polidario    6 年前

    cookie是基于字符串的。因此,在设置cookie值时,需要对其存储非字符串值进行序列化,然后在读取该值时需要对其进行非序列化。见 cookies docs here .

    但是,通常情况下,您不会序列化数据库记录,因为一旦获得 ActiveRecord 通过反序列化返回对象。所以我建议你做下面的事情。

    应用程序/控制器/卖方控制器.rb:

    class SellersController < ApplicationController
      before_action :set_seller, only: [:show]
      before_action :set_seller_first_shop, only: [:show]
      before_action :set_cookies, only: [:show]
    
      def show
        @listings = Listing.where(shop: @shop).paginate(page: params[:page])
      end
    
      private
    
        def set_seller
          @seller = Seller.find(params[:id])
        end
    
        def set_seller_first_shop
          @shop = @seller.shops.first
        end
    
        def set_cookies
          cookies.signed[:user_id] = current_user.id
          cookies.signed[:seller_id] = @seller.id
          cookies.signed[:shop_id] = @shop.id
        end
    end
    

    应用程序/控制器/标题\控制器.rb

    class TitlesController < ApplicationController
      before_action :set_from_cookies, only: [:index]
    
      def index
        @titles = Title.last
      end
    
      private
    
        def set_from_cookies
          @shop = Shop.find(cookies.signed[:shop_id])
          @seller = Seller.find(cookies.signed[:seller_id])
          @user = User.find(cookies.signed[:user_id])
        end
    end