小编Aug*_*tos的帖子

从Rails引擎初始化程序访问主要应用程序机密

我一直在尝试(不成功)从我的Rails可安装引擎中访问主应用程序的应用程序机密.可安装引擎的重点是提供模块化.因此,常见的模式是在主应用程序中提供可配置的参数,其中一些参数需要是秘密的,然后引擎将使用这些参数.

在我的具体情况下,我在我的引擎中使用carrierwave和fog将文件上传到AWS桶.确切的存储桶和AWS凭证未在引擎中指定,但在主应用程序中指定,因为它们会因安装引擎的应用程序而异.

但是,当安装在引擎中时,carrierwave的初始化程序失败,因为它无法找到主应用程序的Rails.application.secrets:

require 'carrierwave'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
  config.fog_provider = 'fog/aws'

  config.fog_credentials = {
    :provider               => 'AWS',
  :aws_access_key_id      => Rails.application.secrets.S3_AWS_ACCESS_KEY_ID,
  :aws_secret_access_key  => Rails.application.secrets.S3_AWS_SECRET_ACCESS_KEY
  }
  config.fog_directory  = Rails.application.secrets.CARRIERWAVE_CONFIG_FOG_DIRECTORY
  config.storage = :fog
end
Run Code Online (Sandbox Code Playgroud)

启动引擎时失败

Missing required arguments: aws_access_key_id, aws_secret_access_key (ArgumentError)
Run Code Online (Sandbox Code Playgroud)

事实上Rails.application.secrets.S3_AWS_ACCESS_KEY_ID(和其他人)nil在初始化程序中进行评估.一旦应用程序运行,它确实在引擎控制器内正确评估,但在初始化程序中它是零.

我修改了这个如下:

:aws_access_key_id      => Rails.application.secrets.S3_AWS_ACCESS_KEY_ID || ENV["S3_AWS_ACCESS_KEY_ID"]
Run Code Online (Sandbox Code Playgroud)

并在每个生产环境中输出ENV VARIABLE以供引擎使用,但这并不理想.任何解决方案将不胜感激.

ruby-on-rails rails-engines

8
推荐指数
1
解决办法
393
查看次数

在Django中根据端点设置不同的CORS规则

我正在尝试找出一种方法,根据后端端点前端的命中情况来制定不同的 CORS 规则。

所以我可以拥有

/api 端点具有 CORS 域白名单和

/public-api 没有 CORS 域白名单。

这是必需的,因为我有两个用于自己前端的内部端点,以及一个可以安装在任何第三方域中的公共 JS 小部件。

我看过django-cors-headers库,但它是正则表达式配置

CORS_ORIGIN_REGEX_WHITELIST = []
Run Code Online (Sandbox Code Playgroud)

致力于让来自域列表的请求通过。

就我而言,我需要一种方法来使用正则表达式(或其他方法)来让对我的端点的请求通过或不通过。

django cors django-cors-headers

7
推荐指数
1
解决办法
1511
查看次数

使用devise_token_auth和active_model_serializer时覆盖序列化程序

在为devise sign_up方法使用devise_token_auth和active_model_serializer时,我无法覆盖Rails序列化程序.

我想在查询我的API时自定义Devise sign_up控制器返回的字段.

devise_token_auth gem文档指出:

要自定义json呈现,请实现以下受保护的控制器方法

注册管理员

...

render_create_success

...

注意:控制器覆盖必须实现它们替换的控制器的预期操作.

这一切都很好,但我该怎么做?

我已经尝试生成如下的UserController序列化程序:

class UsersController < ApplicationController

  def default_serializer_options
    { serializer: UserSerializer }
  end

  # GET /users
  def index
    @users = User.all

    render json: @users
  end

end
Run Code Online (Sandbox Code Playgroud)

但它只用于自定义方法,例如上面的索引方法:它没有像sign_up这样的设计方法被拾取

我很欣赏一个详细的回复,因为我到处寻找,但我一次只得到一块拼图.

ruby-on-rails devise active-model-serializers

5
推荐指数
1
解决办法
1480
查看次数

通过使用关键路线的“快照”(静态渲染)来加速大型 React 项目的最佳方法

我们有一个大型且复杂的传统 React 应用程序,我们在过去几年中一直在构建它。它加载一个index.html,注入javascript并像往常一样从API获取数据。不幸的是,冷加载时间非常糟糕(平均 5 - 7 秒)。一旦所有内容加载完毕,它会像往常一样快速,但冷加载时间会在特定的“关键”页面中杀死我们。这些是我们的公共用户页面,格式为:https://mywebsite/userId

我们正在寻找一种方法来显着加快这些路线的加载时间,其方法超越代码分割或资源优化。我们已经做到了这些,并且正在通过 CDN 提供我们的应用程序。

我们研究了创建这些用户页面的静态“快照”,我们需要使用像react-static这样的东西快速加载,并将它们作为静态版本提供并稍后进行水化。使用 next.js 或 gatsby 之类的东西重写我们的项目不是一个选择,因为它需要太多的工作。SSR 也不是一个选项,因为我们的整个后端都是用 Django 而不是 Node.js 编码的

我们走在正确的轨道上吗?是否可能/值得使用react-static(或类似的工具)来做到这一点?有很多关于如何从头开始创建反应静态项目的文档,但没有关于如何转换现有项目的文档,即使它只是我们需要的一小部分路由。

此外,一旦用户页面上的数据发生变化,我们如何触发适当快照的“重建”?用户更新数据的频率并不高,大约每月 4 次或 3 次,但我们有 3000 名用户,因此平均每小时更新 15 次可能是正常的。我们可以只触发实际更改的路由的重建吗?

reactjs react-static

5
推荐指数
1
解决办法
382
查看次数

使用 EC2 + Rails + Nginx + Capistrano 重启时 Puma 重启失败

我已成功使用 capistrano 将我的 rails 应用程序部署到 Ubuntu EC2。部署时一切正常。Rails 应用程序名称是 deseov12 我的问题是 Puma 不会在启动时启动,这是必要的,因为生产 EC2 实例将按需实例化。Puma 会在通过 Capistrano 部署时启动,它也会在运行时启动

cap production puma:start
Run Code Online (Sandbox Code Playgroud)

在本地机器上。

如果我运行以下命令,它也会在重新启动后在服务器上启动:

su - deploy
[enter password]
cd /home/deploy/deseov12/current && ( export RACK_ENV="production" ; ~/.rvm/bin/rvm ruby-2.2.4 do bundle exec puma -C /home/deploy/deseov12/shared/puma.rb --daemon )
Run Code Online (Sandbox Code Playgroud)

我已按照 Puma 丛林工具的指示使用 upstart 使 Puma 在启动时启动,如下所示:

/etc/puma.conf 的内容

/home/deploy/deseov12/current
Run Code Online (Sandbox Code Playgroud)

/etc/init/puma.conf 和 /home/deploy/puma.conf 的内容

# /etc/init/puma.conf - Puma config

# This example config should work with Ubuntu 12.04+.  It
# allows you to manage multiple Puma …
Run Code Online (Sandbox Code Playgroud)

capistrano ruby-on-rails upstart puma ruby-on-rails-4

4
推荐指数
1
解决办法
3734
查看次数

cancancan authorize_resource无法按预期工作

我收到一个简单的cancancan授权的意外行为.

ability.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    # Define abilities for the passed in user here. For example:
    #
    user ||= User.new # guest user (not logged in)
    if user.is_admin?
        can :manage, :all
    elsif user.is_standard?
        can :manage, ServiceOrder, {user_id: user.id}
        can :manage, ServiceOrderDetail, :service_order => { :user_id => user.id }
    end
Run Code Online (Sandbox Code Playgroud)

service_order.rb控制器(部分显示)

class ServiceOrdersController < ApplicationController
  authorize_resource

  def show
    @service_order = ServiceOrder.includes(:service_order_details).find(params[:id])
  end

end
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它让控制器显示任何service_order记录,而不仅仅是current_user拥有的记录.

这种方法的唯一方法是,如果我手动授权控制器添加:

authorize! :show, @service_order
Run Code Online (Sandbox Code Playgroud)

像这样:

  def show
    @service_order = ServiceOrder.includes(:service_order_details).find(params[:id])
    authorize! :show, @service_order
  end …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails cancan cancancan

4
推荐指数
1
解决办法
1054
查看次数

使用AWS Load Balancer Ngnix和Puma在Rails 4上启用SSL

我尝试过为我的项目配置SSL失败了.

我的AWS负载均衡器配置正确并接受证书密钥.我已将侦听器配置为将端口80流量和端口443流量路由到实例上的端口80.

我想在实例(Nginx和Puma)上不需要进一步修改,因为所有内容都被路由到实例上的端口80.我已经看到了在实例上安装证书的示例,但我知道负载均衡器是SSL终结点,所以这不是必需的.

通过http://www.example.com访问eveything工作正常.但是,通过https://www.example.com访问超时.

我希望得到一些适当的高级设置帮助.

编辑:我没有收到任何回复此问题.我认为它太笼统了?我很高兴得到确认,我使用的高级推理是正确的.我应该仅在负载均衡器中安装证书,并将负载均衡器配置为接受443端口上的连接,但是将80端口上的所有内容路由到Web服务器实例.

ssl nginx amazon-web-services puma ruby-on-rails-4

2
推荐指数
1
解决办法
1493
查看次数

使用Cloudfront修复Route 53 CNAME Alias的响应时间变慢

我刚刚设置了CloudFront发行版以加快网站图像的速度。我的图像存储在S3中。我在Route53中使用CloudFront分布端点的CNAME别名设置了自定义子域。

但是,在使用示例图像测试速度时,我发现以下内容:

这三个URL指向同一张图片:

  • 第一个URL是来自S3的原始图像
  • 通过URL在Route53中设置的CNAME别名访问时,第二个URL是CloudFront发行版中的图像
  • 第三个URL是直接来自Cloudfront发行版的图像

测试是使用来自达拉斯的Pingdom完成的。我在其他地方也取得了类似的结果。

来自S3的较慢加载时间非常合理。图像未在边缘位置缓存。但是,仅通过在发行版前面使用CNAME加载时间几乎翻了一番,这似乎太慢了。我希望使用CNAME,但不以这种性能为代价。

我在这里想念什么吗?我到处都读到,在大多数情况下,额外的DNS CNAME查找可以忽略不计。

performance amazon-s3 amazon-cloudfront amazon-route53

1
推荐指数
1
解决办法
1888
查看次数