小编svo*_*oop的帖子

使用ransacker进行自定义搜索

我正在尝试向ActiveAdmin添加自定义过滤器,这些过滤器最近由Ransack提供支持.不幸的是,ransacker根本没有记录,从网上的少数资源我弄乱了以下(在用户模型中):

ransacker :full_text, formatter: ->(search) {
  ids = User.search_in_all_translated(search).map(&:id)
  ids = ids.any? ? ids : nil
} do |parent|
  parent.table[:id]
end
Run Code Online (Sandbox Code Playgroud)

search_in_all_translated方法返回一个用户数组,该数组与所有已翻译属性中的搜索字符串匹配.

在管理页面上,定义了以下过滤器:

filter :full_text_in,
  label: 'full text search',
  as: :string
Run Code Online (Sandbox Code Playgroud)

过滤器本身有效,因此过滤tom将列出所有匹配的记录.但是,滤波器输入中的值切换为["tom"].

在应用过滤器之前:

在此输入图像描述

应用过滤器后:

在此输入图像描述

任何想法如何解决这一问题?

ruby-on-rails activeadmin ransack

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

使用多个`fields_for`对嵌套表单建立索引

给定模型Albumhas_many Song,后者使用本地化字段,例如:

Song#name_en
Song#description_en
Song#name_fr
Song#description_fr
[...]
Run Code Online (Sandbox Code Playgroud)

由于前端设计,我无法f.simple_fields_for :songs在一个地方为所有歌曲属性做一个,但需要拆分它:

= f.simple_fields_for :songs do
  = render partial: 'song_en_fields', locals: { f: f, locale: :en }
[...]
= f.simple_fields_for :songs do
  = render partial: 'song_fields', locals: { f: f, locale: :fr }
[...]
Run Code Online (Sandbox Code Playgroud)

得到的字段建立索引用[0],[1]等他们应该,但是,指数不为0的每个indvidivual重新启动simple_fields_for,但只是保持计数.

我检查了源代码并index在Rails中找到了一个选项fields_for,但这只是添加了一个额外的索引数组.

有没有办法在同一集合多次调用simple_fields_for(或fields_for)时"重置"索引的自动增量?

ruby ruby-on-rails fields-for simple-form

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

如何获得"超级"的智慧?

假设您正在使用不同的arity覆盖子类中的方法:

class A
  def foo(arg)          # arity is 1
    # doing something here
  end
end

class B < A
  def foo(arg1, arg2)   # arity is 2
    super(arg1)         # <- HERE
  end
end
Run Code Online (Sandbox Code Playgroud)

有没有办法super在这里获得在线的arity ?

(真实的用例:我正在调用super知道超类不带任何参数.但是,如果超类实现(在gem中)发生变化,我想发出警告.)

谢谢你的帮助!

ruby

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

“with_connection”是否需要与“exec_query”一起使用?

我偶尔会使用PG::TRDeadlockDetectedRails with PostgreSQL 应用程序(通过 Passenger/Nginx 提供服务)并跟踪它到代码中使用ActiveRecord::Base.connection.exececute.

为了解决这个问题,我将替换.execute.exec_query.exec_update按照文档的建议。ActiveRecord::Base.connection.exec_query但是,是否从连接池获取连接并没有真正明确。

  • 在 Rails 控制器中使用时ActiveRecord::Base.connection.exec_query,是否必须用 包裹起来ActiveRecord::Base.connection_pool.with_connection(我的猜测:是的)
  • 当在ActiveRecord::Base.connection.exec_query请求上下文之外使用时(例如作为 cronjob 执行的 Rake 任务),是否必须用 包裹起来ActiveRecord::Base.connection_pool.with_connection(我的猜测:是的)

如果需要包装,是否有比以下更短的替代方案:

ActiveRecord::Base.connection_pool.with_connection do |connection|
  connection.exec_update "REINDEX INDEX my_complex_index"
end
Run Code Online (Sandbox Code Playgroud)

(我的猜测:没有)

感谢您的提示!

ruby postgresql activerecord ruby-on-rails

6
推荐指数
0
解决办法
638
查看次数

地方的翻译

我已经根据官方文档实现了客户端地理编码:

https://developers.google.com/maps/documentation/geocoding/

一切正常,但是,有一个缺点:结果总是使用一种语言,即使用language参数请求的语言。

我需要的是翻译成多种语言的地点,即我们网站可用的语言。这是一个例子:搜索“Geneva”会根据language参数产生一个结果地点:

  • en: 日内瓦
  • de: 根夫
  • fr: 日内瓦

有没有办法只用一个 API 调用就获得所有三个翻译,还是我必须单独获取翻译?

谢谢你的提示!

google-maps google-maps-api-3 google-geocoding-api

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

创建 concat_ws 的不可变克隆

这篇博文展示了如何immutable_concat在 Pg 中创建函数的示例:

CREATE OR REPLACE FUNCTION immutable_concat(VARIADIC "any")
  RETURNS text AS 'text_concat'
  LANGUAGE internal IMMUTABLE
Run Code Online (Sandbox Code Playgroud)

我想做同样的事情concat_ws并且相应的text_concat_ws确实存在,但是,以下只会使过程崩溃:

CREATE OR REPLACE FUNCTION immutable_concat_ws(VARIADIC "any")
  RETURNS text AS 'text_concat_ws'
  LANGUAGE internal IMMUTABLE
Run Code Online (Sandbox Code Playgroud)

更新: 的 siguatureimmutable_concat_ws应该是(glue, *parts),一个胶水(text 或 varchar)和一个或多个部分(text、varchar 或 null)。

我在这里缺少什么?

postgresql concat function concat-ws

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

在开发中尝试exception_notification时ActionMailer :: Base :: NullMail

我想将exception_notification gem添加到我们的应用程序中,但是,当我尝试手动触发邮件时会发生这种情况:

exception
# => #<ZeroDivisionError: divided by 0>
ExceptionNotifier::Notifier.exception_notification(request.env, exception)
# => #<ActionMailer::Base::NullMail:0x007fa81bc7c610>
ExceptionNotifier::Notifier.background_exception_notification(exception)
# => #<ActionMailer::Base::NullMail:0x007fa81bf58190>
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,在某个控制器中rescue_from Exception故意调用之后,控制台位于ApplicationController 内部的断点处1/0.

我也在使用delayed_job,但是 - 毫不奇怪 - ExceptionNotifier::Notifier.background_exception_notification(exception).deliver不会假装什么.

我已经设置config.consider_all_requests_local = false了开发,但仍然exception_notification实例化NullMail.在应用程序的其他部分,邮件工作正常并使用sendmail.

我在这里做错了什么想法?谢谢你的帮助!

ruby-on-rails ruby-on-rails-3 exception-notification exception-notifier

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

在 config.assets.precompile 中使用通配符时预编译资产问题

我在 Rails 3.2rc1 应用程序中拥有一些资源,以下是其中的一些:

app/
  assets/
    stylesheets/
      application.css.scss
      users.css.scss
      projects.css.scss
      (...)
      parts/
        fonts.scss
        (...)
Run Code Online (Sandbox Code Playgroud)

application.css.scss只是一个清单,其中包含以下行:

@import 'parts/fonts';
Run Code Online (Sandbox Code Playgroud)

views/layouts/application.html.slim加载预编译的样式表:

= stylesheet_link_tag "application", media: "all"
= stylesheet_link_tag params[:controller], media: "all"
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好,对于开发来说效果很好。在生产部署期间,rake assets:precompile被调用并且它对于应用程序样式表运行良好。但是每个控制器的样式表被跳过,因此应用程序崩溃了。

为了解决这个问题,我将其添加到config/environments/production.yml

config.assets.precompile += %w(*.css *.js)
Run Code Online (Sandbox Code Playgroud)

现在已经编译了每个控制器的样式表,但该应用程序仍然会出现以下问题:

ActionView::Template::Error (application.css isn't precompiled):
    5:     = stylesheet_link_tag "application", media: "all"
  app/views/layouts/application.html.slim:5:in `_app_views_layouts_application_html_slim__4032169744877009540_23192340'
Run Code Online (Sandbox Code Playgroud)

但是当我查看时public/assets/,预编译的application-3218a93530ecb65582d5b345133dab49.css和压缩的双胞胎就在那里。

如果我将通配符替换为config/environments/production.yml所有每个控制器样式表的列表(换句话说:除了 之外的所有样式表application.css),一切都会像魅力一样工作:

config.assets.precompile += %w(users.css projects.css)
Run Code Online (Sandbox Code Playgroud)

应用程序样式表是否被处理了两次,从而导致预编译无法像宣传的那样工作?

ruby-on-rails ruby-on-rails-3 asset-pipeline

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

在 docker-compose.yml 中设置桥名称

我正在运行一个启用了“userns-remap”的dockerized GitLab 实例,并且我想在主机上使用共享的 PostgreSQL。然而,当我 docker-compose up 时创建的桥在每次运行时都会获得一个新的随机名称“br-xxxxxxxxxxxx”。

这通常不会成为问题,但主机上的 Vuurmuur 防火墙默认会阻止从容器到主机的所有流量,并且我需要网桥名称才能在 Vuurmuur 上设置允许规则。

我发现了一些相关的主题,例如com.docker.network.bridge.name,但我很难将它们放在一起。到目前为止,我试图找到一种方法来确保每次容器升级时,网桥都会分配相同的名称和相同的 IP/掩码。这是否可能,docker-compose.yml或者这种方法是完全错误的吗?

docker-compose.yml到目前为止,这是不引人注目的:

version: '3.8'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.example.com'
        gitlab_rails['db_adapter'] = 'postgresql'
        gitlab_rails['db_host'] = '172.18.0.1'
        (...)
    ports:
      - '8080:80'
    volumes:
      (...)
Run Code Online (Sandbox Code Playgroud)

感谢您的任何提示!

bridge docker docker-compose

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