Ruby on Rails初学者问题:平等

我开始了解ROR,并且我正在撰写带有文章等内容的博客。 我做了这段代码:

def show
 id = params[:id]
 list = Article.all
 is_valid = false

list.all.each do |article|
  if article.id == id
    @is_valid = true
    break
  end
end

如您所见,此代码只想检查商品ID是否存在。因此,当我尝试使用或显示@is_valid布尔值时,我正在测试id和article.id(这是一个链接到数据库中适当表的模型)之间的相等性,但是我看到article.id == id每次都是FALSE,即使article.id = 2和id = 2,我也试图考虑所有可能导致这种情况发生的原因,但我承认我仍然误会了这一点。

然后我问你是否知道为什么会这样。当然,等于2 == 2的等式会将@is_valid更改为true。

谢谢您的帮助!

lxleesjs 回答:Ruby on Rails初学者问题:平等

可能是因为params [:id]这是一个字符串和article.id这是一个整数

(byebug) params
{"controller"=>"admin/my_controller","action"=>"edit","id"=>"1"}

是的,它是...“ id”是字符串“ 1”,因此您可以尝试以下操作:


def show
 id = params[:id].to_i
 list = Article.all
 is_valid = false 

  list.all.each do |article|
    if article.id == id
      @is_valid = true
        break
      end
   end
end

也许可以工作。

这是您问题的答案, 但是,如果您想了解更多有关Activerecord的信息,可以这样做

Article.exists?(params[:id])

这将完成您要针对db的查询所做的尝试。

如果您只想获得简单的文章

record = Article.find_by(id: params[:id]) #return nil when not exist
if record # if nil will threat like false on ruby
#my code when exist
else
#my code when not exist
end

将起作用(您也可以使用find,但是当不存在时find会抛出异常ActiveRecord :: RecordNotFound,因此您必须捕获该异常。

Activerecord有很多方法可以检查此情况,而您无需手工完成。

,
def show 
  @article = Article.find(params[:id])
end

这将创建一个数据库查询,该查询返回一行。如果找不到记录,则.find引发ActiveRecord::NotFound异常。 Rails捕获此错误并显示404页。 Article.find_by(id: params[:id])是不会提高的“安全”替代方案。

您的代码有问题,因为list = Article.all会将所有记录加载到数据库之外,这很慢,并且如果您有足够的文章,则会耗尽服务器上的内存。这是解决任务的最无效的方法。

如果您只想测试是否存在,请使用.exists?.any?。这将创建一个COUNT查询,而不是选择行。

Article.where(title: 'Hello World').exists?
本文链接:https://www.f2er.com/3121878.html

大家都在问