标签: ruby-on-rails-5

Rails:迁移到 Auth0,同时保留 postgres 记录和关联

我的项目目前用于has_secure_password处理用户(类似于这个railscast)。一切正常,但展望未来,我觉得切换到 Auth0 会带来好处,并希望在太多用户注册之前立即进行转换。

用户被保存到具有多个关联(签入/评论/等)的用户模型中。如何将 Auth0 用户链接到我的数据库中的用户记录。我想我可以在他们登录后通过电子邮件查找(因为它们将是唯一的)或 Auth0 用户 ID(并向用户表中添加一个新列)。似乎我可以简单地使用 Auth0 登录回调来登录用户(使用我当前的会话控制器),但是当在 OmniAuth 中创建用户时,如何在我的数据库上创建用户。是否也有回调?

在一个完美的世界中,我想做这样的事情:

  1. 用户使用 Auth0 锁进行注册。在 Auth0 数据库上创建一个新帐户。
  2. 回调会在我的数据库中触发一条新记录,该记录包含来自 Auth0 的所有信息并具有关联列。
  3. 用户登录并且他们的 user_id(来自我的数据库)存储在会话中。
  4. 用户对个人信息(姓名/电子邮件/等)所做的更改在两个数据库上都会发生更改。

我想要的可能吗?或者我应该坚持我当前的身份验证?

authentication data-migration ruby-on-rails ruby-on-rails-5 auth0

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

Gravatar 图像不显示?

我正在学习 Michael Hartl 的 rails 教程,目前正在尝试向用户个人资料中添加一个 gravatar 图像。但是,gravatar 默认图像不会加载到我的用户显示页面上。

帮手/users_helper.rb

module UsersHelper

  def gravatar_for(user)
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end
Run Code Online (Sandbox Code Playgroud)

用户/show.html.erb

<% provide(:title, @user.name) %>
<h1>
    <%= gravatar_for @user %>
    <%= @user.name %>

</h1>
Run Code Online (Sandbox Code Playgroud)

用户控制器.rb

class UsersController < ApplicationController
  def new
  end

  def show
    @user = User.find(params[:id])
  end
end
Run Code Online (Sandbox Code Playgroud)

我仔细检查了gravatar url,但它似乎仍然没有加载。也尝试重新启动服务器。不确定是不是这个问题?

ruby-on-rails ruby-on-rails-5

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

将外部 API 调用到 Ruby on Rails 应用程序中

我正在使用 Clear bit gem。如何在 Rails 应用程序中调用外部 API 并在没有默认数据库的情况下发送数据来存储数据。我需要构建一个像 Clear bit 表单这样的表单并来回发送数据。我需要控制器和模型吗?相同?

ruby api ruby-on-rails ruby-on-rails-5

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

Rails - 查询关联模型

我觉得这很简单,但我发现似乎没有任何效果。我正在使用带有 Rails 5 的 PostgreSQL 数据库。我需要运行一个查询来查找在名称列中包含文本字符串的所有产品或在关联模型中找到相同字符串的所有产品。这是我的模型结构。

class NormalBrand < ApplicationRecord
    has_many :normal_models
end

class NormalModel < ApplicationRecord
    belongs_to :normal_brand 
    has_many :products
end

class Product < ApplicationRecord
    belongs_to :normal_model
end
Run Code Online (Sandbox Code Playgroud)

每个模型都有一个名为“名称”的字段。我试图在我的 Products 控制器中创建一个查询,以查找在 3 个模型“名称”列中的任何一个中找到文本字符串的所有产品。像这样的东西...

@products = Product.where("name like lower(?)", "%#{value}%").or.where("normal_model.name like lower(?)", "%#{value}%").or.where("normal_model.normal_brand.name like lower(?)", "%#{value}%")
Run Code Online (Sandbox Code Playgroud)

我知道上面的查询是完全错误的,我应该有某种 joins 语句,但这就是我需要帮助的地方。提前致谢。

ruby ruby-on-rails ruby-on-rails-5

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

Turbolinks 5 在某些链接上不起作用

对于这个看似简单的问题,我找不到任何答案。在我的 rails5 应用程序中,某些链接确实使用 turbolinks 来加载新页面。但有些只是启动整页重新加载。

该链接没有附加 js,该链接上未禁用 turbolinks。

此链接使用 turbolinks

= link_to qm_input_path('hour') do ...
<a class="navbar-brand" href="/qimen/hour/input"> ...
Run Code Online (Sandbox Code Playgroud)

在行动中它有

render layout: 'input'
Run Code Online (Sandbox Code Playgroud)

而这个链接没有

= link_to qm_chart_path(@foo, @bar), class: 'btn btn-default pull-right next' do ...
<a class="btn btn-default pull-right next" href="/qimen/hour/chart/foo/bar"> ...
Run Code Online (Sandbox Code Playgroud)

在行动中它有

render layout: guess_layout
Run Code Online (Sandbox Code Playgroud)

因此,没有任何内容明确阻止 turbolinks 工作。

为什么?

turbolinks ruby-on-rails-5 turbolinks-5

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

在 Rails 中,如何删除数组中的所有对象?

我正在使用 Rails 5,我想删除一组对象。在之前的帖子中,我读到“destroy_all”是真理和光明。我有两个对象数组,我将它们减去以获得第三个数组

  unused_currencies = all_currencies - currencies_from_feed
  unused_currencies.destroy_all
Run Code Online (Sandbox Code Playgroud)

但是在使用时出现destroy_all了这个错误:

NoMethodError: undefined method `destroy_all' for #<Array:0x007feea8878770>
Run Code Online (Sandbox Code Playgroud)

ruby arrays ruby-on-rails destroy ruby-on-rails-5

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

如何在不更改 ActiveRecord 的情况下验证保存的记录?

我的 Rails5.1.4 项目有 Station 模型,还有一些保存的记录。

class Station < ApplicationRecord
end

> Station.first
# => #<Station:0x0055f5ca447d78 id: 1, name: nil>
Run Code Online (Sandbox Code Playgroud)

然后我添加了新的验证(名称的存在检查)。

class Station < ApplicationRecord
  with_options on: [:publishing] do
    # added new validation
    validates :name, presence: true
  end
end
Run Code Online (Sandbox Code Playgroud)

在这里,如果验证!方法调用而不改变属性。证实!方法返回真。

> reload!
> station = Station.first
# => #<Station:0x0055f5cf4b6228 id: 1, name: nil>
> station.validate!(context: :publishing) # without attributes changing
# => true
# expected ActiveRecord::RecordInvalid raising.
Run Code Online (Sandbox Code Playgroud)

这是我的一个问题。

我希望 ActiveRecord 会被提升,ActiveRecord::RecordInvalid因为我添加了名称的存在验证。

我可以这样做吗?

问候

validation activerecord ruby-on-rails ruby-on-rails-5

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

如何使用 Rails 中的 Mobility gem 以一种形式实现所有翻译?

在我的 Rails 应用程序中,我使用Mobility gem进行翻译

如何构建包含所有翻译的表单,例如:

  • 姓名 [zh]: _______
  • 姓名 [fr]: ________
  • 姓名[德]:_______
  • ...

什么是最好的方法?

ruby-on-rails mobility ruby-on-rails-5

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

如何在 1 次调用中在 Rails 中查找和更新或创建对象?

所以我试过这个:

stock = Stock.find_or_create_by(ticker: ticker, jse_link: link, name: name, price: price)
Run Code Online (Sandbox Code Playgroud)

事实证明,如果 ActiveRecord 找不到Stock匹配所有 4 个属性的对象,它会创建一个新对象。因此,如果它找到与 4 个属性中的 3 个匹配的对象,则会创建一个重复的属性。

有没有一种简单的方法,而不必使用if语句在 1 次调用中完成所有这些操作?

即我想做的是:

  • 找到Stock匹配的对象ticker: ticker
  • 如果该Stock对象存在,那么我想更新price: price.
  • 如果该Stock对象不存在,那么我想创建一个具有这 4 个属性 ( ticker: ticker, jse_link: link, name: name, price: price)的新对象。

我可以在不使用条件语句的情况下执行上述操作吗?

ruby ruby-on-rails ruby-on-rails-5

0
推荐指数
2
解决办法
2330
查看次数

是否可以确定变量是否为 activerecord 对象?

我正在尝试创建一个超级通用类,当从它继承时,我可以调用通用 Sidekiq 工作器。

这个想法是让我的所有服务都可以正常或异步调用。问题是我想将对象传递给服务,但我只能将指针传递给工作人员。

因此,如果我的服务需要一个User和一个,String我目前将拥有:

*args = [#<User:y6t4ert56uu6>, "I'm a string"]
Run Code Online (Sandbox Code Playgroud)

为此,我需要制作这个数组:

[{activerecord: true, class: "User", value: user_id}, {activerecord: false, class: "String", value: "I'm a string"}]
Run Code Online (Sandbox Code Playgroud)

一旦我知道User是一个 activerecord 对象,我就可以安全地假设有一个id(假设我只是传递保存的对象)。否则我只会输出变量的值。

完美解决方案的一个想法是:(没有重要的代码)

user = User.first
str = "Hello"

is_activerecord(user) # returns true
is_activerecord(str) # returns false
Run Code Online (Sandbox Code Playgroud)

任何人都可以提出有关如何做到这一点的想法吗?

谢谢

ruby activerecord rails-activerecord ruby-on-rails-5

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