【问题标题】:Conditional statement fails Rails 4条件语句失败 Rails 4
【发布时间】:2016-04-10 00:24:34
【问题描述】:

我正在开发一个 Rails 应用程序,该应用程序具有在创建时分配了类别的 Pin 图。该应用程序共有 16 个类别。所有 Pin 图都显示在主索引页面上(类别 16 除外),用户可以单击 Pin 图,将它们带到 @Pin 的显示页面。 Show 页面有一个 @Pin 和一个从 db 中的所有 Pins 中选择的随机 Pin(类别 16 除外)。上面提到的动作是在pins控制器中定义的,并且正常运行。

The problem is when Category 16 is selected and the user proceeds to a Pins show page the Random Pin should be a Pin from Category 16 Only, but it is being selected from all the Pins in the db!

我已经在索引中设置了变量和条件语句,并显示了实现上述操作的动作,请在pins控制器show-action中查看我的cmets。问题代码在评论中仍然存在 ====SOMETHING WRONG!====

请帮助我对 Rails 比较陌生,我不确定我做错了什么,我花了几个小时尝试各种但没有任何效果。

pins_controller 索引操作

def index
if params[:category].blank?
  @restricted = Category.find(16) # category id 16 set as var @restricted used to exclude cat 16 from index page in line below.
  @pins = Pin.where.not(category: @restricted).all.order("created_at DESC").paginate(page: params[:page], per_page: 20)
else
  @category_id = Category.find_by(name: params[:category]).id
  @pins = Pin.where(category_id: @category_id).order("created_at DESC").paginate(page: params[:page], per_page: 20)
end 

pins_controller show-action 问题

def show
@pin.increment_view_count
@show_main_cat = Category.where.not(16) # all categories except category id 16 set as var @show_main_cat
if @show_main_cat.present? 
  @restricted = Category.find(16) # category id 16 set as var @restricted.
  @random_pin = Pin.where.not(id: @pin, category: @restricted).order("RANDOM()").first # select random pin from all categories except 16 + not @pin.
end
@show_restricted_cat = Category.find(16) # category 16 set as var @show_restricted_cat < ==========SOMETHING WRONG!==============
if @show_restricted_cat.present?
  @restricted = Category.where.not(16) # all categories except 16 set as var @restricted. 
  @random_pin = Pin.where.not(id: @pin, category: @restricted).order("RANDOM()").first # Only select random pin from category 16 + not @pin.
end

@reviews = Review.where(pin_id: @pin.id).order("created_at DESC").limit(5)
if @reviews.blank?
  @avg_review = 0
else
  @avg_review = @reviews.average(:rating).round(2)
end

【问题讨论】:

  • 我怀疑你的意思是 where.not(id: 16) 而不是 where.not(16)

标签: ruby-on-rails


【解决方案1】:

这条线不是你所期望的

@random_pin = Pin.where.not(id: @pin, category: @restricted).order("RANDOM()").first # Only select random pin from category 16 + not @pin.

它将从类别 16 OR id not @pin 中随机选择一个 pin(我认为 来自类别 16 AND id not @pin)。将其更改为:

@random_pin = Pin.where.not(category: @restricted).where.not(id: @pin).order("RANDOM()").first

玩得开心!

【讨论】:

  • 好的,上面的建议是,如果查看类别 id 不是 16 的 Pin(节目),如何选择一个非类别 16 的随机 Pin。这不是问题,但是我尝试提出 where.not(id: 16) 并返回错误“无法将哈希转换为整数”。无论如何,我的 where.not(16) 工作正常。问题是,如果用户选择类别 16 并进入显示页面(带有 cat 16 的图钉),随机图钉只能来自类别 16。另一边(如果用户选择除 16 之外的任何猫的图钉,随机图钉) pin 应该不是 16 )工作正常。
  • 啊,好吧,所以你的@restricted 是除 16 之外的所有类别吗?所以我会更新答案
  • 不,两者都是,如果' show_main_cat.present? ' 受限是类别 16。如果 'show_restricted_cat.present? ' 受限是除 16 之外的所有类别。仔细查看 show-action。
猜你喜欢
  • 2016-06-25
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 2016-11-16
  • 2015-12-29
  • 1970-01-01
  • 2015-12-15
  • 2018-02-02
相关资源
最近更新 更多