如果控制器错误中有条件,则为轨道



我想知道如何在我的项目索引上只打印带有 :is_available 列的房间或带有 :true 值(是布尔值)的房间表。

我不知道如何实现这一目标(对不起,我是 Rails 的新手)。任何建议将不胜感激!

我当前的代码有此错误:

"ActiveRecord::RecordNotFound in RoomsController#home找不到没有身份证的房间"

这是我rooms_controller代码:

class RoomsController < ApplicationController
    before_action :get_room, only: [:index, :home]
  def index
  end

  def show
    @room = Room.find(params[:id])
  end

  def home
    if params[:set_locale]
        redirect_to root_url(locale: params[:set_locale])
    else
        puts @rooms if Room.all(params[:is_available => :true])
    end
  end

  def get_room
    @rooms = Room.all
  end

end

你已经有了@rooms = Room.all,你只需要精确你的查询(从全部到你的is_available限制)。

  def home
    if params[:set_locale]
        redirect_to root_url(locale: params[:set_locale])
    else
        puts @rooms.where(is_available: true)
    end
  end

此外,还应避免在控制器逻辑中使用puts。将变量传递给视图(您可以更改@rooms值或创建新变量@available_rooms),respond_with它或使用Rails.logger(如果您使用 put 作为调试解决方案)记录它。

  def index    
  end
  def home
    if params[:set_locale]
      redirect_to root_url(locale: params[:set_locale])
    elsif params[:is_available]
      puts @rooms 
    end
  end
  def get_room
    @rooms = Room.where(is_available: true)
  end

在控制器中使用放置 - 不是一个好主意。使用视图显示数据。

您可能会遇到以下几个问题:


路线

您的index方法看起来为空。我猜你用"家"作为替代品

在这种情况下,您必须知道这是什么类型的操作 - membercollection操作?这很重要的原因是,当您定义routes时,您必须确保以正确的方式定义路线。对于您的home路线,我会这样做:

#config/routes.rb
resources :rooms do 
    get "home", action: "home"
end

范围

您可以使用scope恢复存在:is_available的所有值。这在模型中是这样的:

#app/models/room.rb
Class Room < ActiveRecord::Base
   scope :is_available?, -> { where(is_available: true) }
end

这将允许您调用

@room = Room.is_available?

法典

尽管您没有向我们提供错误的任何上下文(当它发生时,您如何使它发生),但这是我为帮助修复它所做的:

  #app/controllers/rooms_controller.rb
  def home
    if params[:set_locale]
        redirect_to root_url(locale: params[:set_locale])
    else
        puts Room.is_available?
    end
  end

这可能会根据您发送的参数以及您发送它们的方式而改变

def home
    if params[:set_locale]
        redirect_to root_url(locale: params[:set_locale])
    else
        puts @rooms if params[:is_available] && Room.where(is_available: true)
    end
  end

应该工作。

最新更新