【问题标题】:Can't use rails params even though I can see them. Specifically charge_id即使我可以看到它们,也不能使用 rails 参数。具体charge_id
【发布时间】:2020-01-09 08:28:20
【问题描述】:

我一直致力于将我的 Rails、Shopify 嵌入式应用程序连接到 Shopify 计费 API。看起来很简单:

  1. 您通过 API 创建一个新的 Shopify RecurringApplicationCharge 对象,将其提交给 Shopify。
  2. 他们返回填充了其他字段的对象,包括您可以重定向到的“confirmation_url”。
  3. 此确认 URL 有一个 charge_id 参数,您可以使用它来激活计费。

我可以顺利完成上述操作,甚至可以在日志中以及运行 params.inspect 时看到“charge_id”参数。但是,我不能使用它。每次我尝试将参数分配给实例变量时,我都会得到“nil class”。

控制器

class HomeController < AuthenticatedController
  before_action :require_login, except: [:activate_charge]
  skip_before_action :verify_authenticity_token, only: [:activate_charge]
  before_action :require_subscription, except: [:activate_charge]


    def require_subscription
      unless ShopifyAPI::RecurringApplicationCharge.current
          @recurring_application_charge = ShopifyAPI::RecurringApplicationCharge.new
          @recurring_application_charge.name = "Monthly Plan"
          @recurring_application_charge.price =  15.0
          @recurring_application_charge.return_url = "https://xxxxx.ngrok.io/activatecharge"
          @recurring_application_charge.test = true
          @recurring_application_charge.trial_days = 7
          @recurring_application_charge.save

          if @recurring_application_charge.id
            #@tokens[:confirmation_url] = @recurring_application_charge.confirmation_url
            fullpage_redirect_to(@recurring_application_charge.T)
          end
        end
    end

    def activate_charge
      @params = params[:charge_id]

      #@recurring_application_charge = ShopifyAPI::RecurringApplicationCharge.find(params[:charge_id])
      #@recurring_application_charge.status == "accepted" ? @recurring_application_charge.activate : redirect_to('/')
      #@recurring_application_charge.save

      redirect_to('/')
    end

    def recurring_application_charge_params
        params.require(:recurring_application_charge).permit(:name, :price, :capped_amount, :terms, :trial_days, :charge_id)
    end

params.inspect

<ActionController::Parameters {"charge_id"=>"12271520309", "hmac"=>"f7a75bba157ef40b3144d8d0e8ceb8b37628ea294fbe16887b623c0d311d84da", "locale"=>"en-GB", "session"=>"f8b8ef448a1d9883e4884c858e0bc39d789d53d2eeffffb34c42f5bc390af6f1", "shop"=>"xxxxx.myshopify.com", "timestamp"=>"1578555752", "controller"=>"home", "action"=>"activate_charge"} permitted: true>

一些线索

  • 我有一个用于其他用途的 API 控制器,它未经 Shopify 或 Clearance 的身份验证。如果我使用这个控制器,我可以获得“charge_id”参数(尽管这个控制器不能用于其他原因)。

  • 我一直在尝试确保强大的参数允许它,但我没有写入模型,所以这不重要吗?

  • 在关于如何设置计费的旧 Shopify 页面上,他们在第一个对象创建阶段有这行代码,我无法实现:

    @tokens[:confirmation_url] = recurring_application_charge.confirmation_url

任何帮助都会很棒,我不知道这是否是一个非常简单的问题,或者是否存在我完全没有注意到的身份验证问题。

谢谢!

编辑 返回,当 params.class 和 params.inspect 被调用时

ActionController::Parameters

<ActionController::Parameters {"charge_id"=>"12284756045", "hmac"=>"9ff4d8a30d623f2d03d0226ff3d98c780e451615d630c149697e5b2dd4ffd4b5", "locale"=>"en-GB", "session"=>"f8b8ef448a1d9883e4884c852e0bc39d789d53d2eeffffb34c42f5bc390af6f1", "shop"=>"xxxx.myshopify.com", "timestamp"=>"1578737591", "controller"=>"home", "action"=>"activate_charge"} permitted: false>

另一条信息,如果我将以下内容添加到控制器:

params = params.to_h[:charge_id]

然后调用params["charge_id"],从视图中可以得到返回的charge_id。 但是,当我尝试将其分配给控制器中的@charge_id,然后尝试在视图中调用@charge_id 进行测试时,它什么也不返回:S

params = params.to_h[:charge_id]
@charge_id = params["charge_id"]

【问题讨论】:

  • 您说每次将参数分配给实例变量时,都会得到 nil 类;我猜你说的是@params = params[:charge_id]?如果是这样,那么您当时是说@params 等于nil?如果是这样,您能否在@params = params[:charge_id] 下方添加puts params.classputs params.inspect,并让我知道输出。我有一种感觉,可能在某个地方,params 对象已被修改,或者为什么你得到了 nil 值。
  • 完全同意@Jay-ArPolidario,请检查您的 ID 类别以及您希望将其分配到的类别。
  • 嗨 Jay 和 ARK,感谢您的帮助。我刚刚将输出添加到问题的底部。
  • 我现在发现,由于某些奇怪的原因,当 Shopify 重定向到 /activate_charge 时,我的应用程序忽略了控制器的 active_charge 方法中的所有代码。我认为这就是我的问题所在。

标签: ruby-on-rails ruby-on-rails-4 shopify-app


【解决方案1】:

ActionController::Parameters 使用 "charge_id",而不是 :charge_id。也许你应该试试。或者使用params.to_h[:charge_id],因为to_h 将返回一个HashWithIndifferentAccess。

【讨论】:

  • 您好 Salz,感谢您的帮助。刚刚在控制器中尝试了 '@params = params["charge_id"]',然后在视图中尝试了 ''。恐怕什么都没回来
  • 我认为您可能会使用“params.to_h[:charge_id]”,但是,rails 仍然不允许我将结果分配给实例变量。我已经添加到我的问题的底部,解释发生了什么。
  • 也许 StrongParameters 也可以防止这种情况发生,总的来说你最好看看edgeguides.rubyonrails.org/… | api.rubyonrails.org/classes/ActionController/Parameters.html
【解决方案2】:

params 将您的 id 转换为字符串,而您可能会将其分配给不是字符串的 id,这意味着您应该:

  @params = params[:charge_id].to_i

分享更多细节,我想我们将能够解决这个问题。

更新(调试帮助):

对于初学者控制器调试(我猜是你喜欢的),在你得到@params = params[:charge_id]的行之前:

  puts "*"*100
  puts params
  puts "*"*100

现在转到您的服务器正在运行的控制台,并在重新加载页面(在浏览器中)后,按 Ctrl+Shift+F 并输入*******。这将找到打印参数的位置。 GLHF

【讨论】:

  • 嗨 ARK,我刚刚将 '@params = params[:charge_id].to_i' 放入我的控制器,然后在我的视图中输入了 '',但它没有t返回任何东西:s。我会继续修改
  • 你知道 gem byebug 吗?如果没有,你需要它伴侣。
  • @Oli 您不应该在视图中检查参数。你应该在你想看到它们的价值的时候检查它们,即在控制器动作中,因为参数是为控制器准备的。这是给你的链接:fatosmorina.com/debug-ruby-code-using-byebug-gem
  • 据我所知,你对params的作用和用法不是很清楚。如果您愿意被指导,我希望我可以帮助您指导;)
  • 谢谢 ARK,我会做一些阅读。非常感谢您的帮助。
【解决方案3】:

呃,虎头蛇尾。 我注意到 activate_charge 方法中的代码实际上都没有运行。然后我发现在我的控制器的私有部分中有 require_subscription 和 activate_charge 方法会导致问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2023-03-18
    • 2022-11-23
    • 2020-11-19
    相关资源
    最近更新 更多