【问题标题】:How do you call a model's show url from a Rail create controller?如何从 Rail 创建控制器调用模型的显示 URL?
【发布时间】:2023-03-10 16:02:02
【问题描述】:

我无法从创建控制器中调用模型的显示路径。

我在 Rails 3.2 应用程序中使用 Koala gem。当用户创建特定记录类型时,我正在尝试自动发布到 Facebook 的开放图表。

我的页面设置了所有必需的 FB 元标记。

我可以从控制台运行 Koala 方法,一切正常。

但如果我尝试从控制器运行它,我会收到错误。

我的控制器如下所示:

def create
  @fb_model = current_user.fb_models.build(params[:fb_model])   
  if @fb_model.save
    Koala::Facebook::API.new(app_token).put_connections( current_user.fb_uid, "namespace:action", :object => fb_model_url(@fb_model) ) 
    respond_to do |format| 
      format.html { redirect_to(@fb_model, :notice => 'Successfully created.') }
      format.xml  { render :xml => @fb_model, :status => :created, :location => @fb_model }    
    end
  else
    respond_to do |format|
      format.html { render :action => "new" }
      format.xml  { render :xml => @fb_model.errors, :status => :unprocessable_entity }
    end
  end
end

当我创建记录时,我的日志显示:

Koala::Facebook::APIError (HTTP 500: Response body: {"error":{"type":"Exception","message":"Could not retrieve data from URL."}}):

如果我编辑控制器以使用静态 url 进行测试,一切正常。

  ...
  if @fb_model.save
    Koala::Facebook::API.new(app_token).put_connections( current_user.fb_uid, "namespace:action", :object => "http://myapp.com/fb_model/2" ) 
  ...

为什么我不能使用 fb_model_url(@fb_model) 在创建控制器中将记录的 url 传递给 FB?

【问题讨论】:

    标签: ruby-on-rails koala


    【解决方案1】:

    我最终明白了这一点。这实际上是一个非常令人沮丧的问题,因为没有迹象表明这是任何日志或其他地方的问题。

    问题是我在 Heroku 上进行部署/测试,并且只运行了 1 个 web dyno。我的应用程序无法同时处理 Facebook 请求和 post/get,从而导致错误。

    这已在另一个问题Facebook Open Graph from Rails Heroku 中得到解决。这真的不是我所期望的,而且我在之前的任何搜索中都没有遇到这个问题。希望这可以帮助其他人。

    我通过从瘦切换到独角兽解决了这个问题。

    【讨论】:

      【解决方案2】:

      保存父模型时构建已完成,并且您似乎没有在父模型上进行操作。

      我想你真的想要这个:

      @fb_model = current_user.fb_models.new(params[:fb_model])

      另外你似乎调用了两次@fb_model.save 这是错误的。

      【讨论】:

      • 谢谢@isotope。我尝试使用 new 代替 build,但仍然出现 URL 错误。我已经更新了我上面的问题。感谢您提出任何其他想法。
      • 我不确定,你需要有一个关于 fb_model_url 返回的内容的 loko,它是否包括协议?我会尝试一半,看看是否有效::object => "http://myapp.com/fb_model/#{@fb_model.id}"
      • 嗨同位素,感谢您的帮助。抱歉,我的速度很慢,“它是否包含协议”是什么意思?如果我将 fb_model_url 呈现为文本,则它是正确的 url。该协议(Facebook?)是通过 Koala::Facebook::API 函数定义的,然后 FB 从目标页面标题中的 FB 元标记中抓取信息。我会尝试你的中途建议,然后报告。谢谢!!
      • URL protol,'http://' 或 'https://' 如果缺少,那么它可能会认为它是一个相对链接。
      • 谢谢@isotope。您的建议帮助我调试了这个。问题与我想的不一样!我会发布一个详细的答案。
      【解决方案3】:

      感谢您发布您的发现 - 过去几天我一直在处理这个问题,但没想到这一点。所以当你简单地增加你的测功机负载时,你不再有这个错误了吗?即使我的“put_connections”回调在 heroku 控制台中工作,我也即将使用 Javascript SDK。

      【讨论】:

      • 嗨,约翰,我感受到了你的痛苦。这让我把头发扯掉了!作为第一步,我增加了 Heroku 上的测功机数量。这让事情奏效了。作为一种更具成本效益的解决方案,我将 Thin 换成了 Unicorn,它可以有效地处理排队/同时的请求。在 Unicorn 下,我能够将我的 dynos 减少到 1,并且仍然可以完成这项工作。现在,这在暂存环境中对我来说非常有效,尚未在任何重大负载下进行测试。
      • 说真的,几乎整整两天尝试了我能想到的所有排列。我正要问你是怎么做的;谢谢你的建议。我会调查独角兽。
      猜你喜欢
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多