【问题标题】:Friendly_id PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer:Friendly_id PG::InvalidTextRepresentation:错误:整数输入语法无效:
【发布时间】:2018-10-22 19:08:40
【问题描述】:

我尝试使用 Friendly_id,但只有一个模型出现错误。

轨道模型:

class Track < ApplicationRecord 
  extend FriendlyId
  friendly_id :track_name, use: :slugged
  has_many :pois

poi 模型:

class Poi < ApplicationRecord
  extend FriendlyId
  friendly_id :name_and_city, use: :slugged
  belongs_to :track

我需要一个按曲目分类的 Pois 列表

在我的 pois_controller 中:

def index
  @pois = Poi.all
  @pois = Poi.where("track_id = ?", params[:track_id])

在我的路线中:

 resources :tracks, only:[], :shallow => true  do
   resources :pois
 end

但是我想去我的 pois_index,track_id 的参数是一个字符串(slug),而不是一个整数。

我能做什么?

【问题讨论】:

  • 如果你需要track_id 是一个整数,为什么不直接转换它呢? params[:track_id].to_i。此外,您不需要 .all 查询。
  • 因为在参数中我有track slug而不是track id

标签: ruby-on-rails friendly-id


【解决方案1】:

在 Rails 中将参数插入原始 SQL 是个坏主意。这就是为什么你有错误的语法错误。在这种情况下,您应该使用 ActiveRecord。

Poi.where(track_id: params[:track_id])

当您将参数插入到 sql 时,您应该防止 sql 注入。 ActiveRecord 会自动完成。

【讨论】:

  • 也许......但问题不在这里。我得到的是蛞蝓而不是身份证。参数:{"locale"=>"en", "track_id"=>"variante"} Poi 负载 (0.5ms) SELECT "pois".* FROM "pois" WHERE "pois"."track_id" = $1 [[" track_id", 0]]
  • 我看到 rails 控制台,当我尝试 User.where('id = ?', 'asd') 时出现错误 ActiveRecord::StatementInvalid: PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: "asd" 当我这样做时 User.where(id: 'asd') 我有 #&lt;ActiveRecord::Relation []&gt; 所以你的错误表示错误的参数插值。
  • 这是真的。 Thks 我没有更多这个错误,但我的列表保持空白。 :(
  • 你可以通过track slug找到pois。如果找到轨道,然后找到 pois。 tracks = Track.friendly.find(params[:track_id]); @pois = Poi.where(track_id: tracks) 根据 FriendlyId 的guide
  • 友好的 gem 只需为 ActiveRelation 或 ActiveRecord 添加friendly.find 方法。所以你只能使用这种方法通过slug查找,然后使用ActiveRecord。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 2013-08-20
  • 2014-03-30
  • 1970-01-01
  • 2014-07-17
  • 2012-12-21
相关资源
最近更新 更多