【问题标题】:If one record found execute show action如果找到一条记录,请执行显示操作
【发布时间】:2015-08-10 17:24:45
【问题描述】:

我想知道执行下一个任务的最佳做法是什么。

我有一个搜索结果要从索引操作中显示。每个单独的记录都会通过显示操作显示在弹出窗口中。

如果只找到一条记录,我想做的是执行弹出窗口。

这是我已经尝试过的。

def index
 @companies = Company.search(params[:query]).results
 @count = @companies.total
 if @count == 1
   return
   render company_path       
 end

结束

似乎 returnredirect_torender 在一个动作中表现不佳。

还有其他想法吗?

更新添加了显示操作

def show
 sleep 1/2
 client = Elasticsearch::Client.new host:'127.0.0.1:9200', log: true
 response = client.search index: 'companies', body: {query: { match: {_id: params[:id]} } }
 @company = response['hits']['hits'][0]['_source']
   respond_to do |format|
     format.html # show.html.erb
     format.js # show.js.erb
     format.json { render json: @company }
   end
  # more code 
end

【问题讨论】:

  • 为什么条件语句中有returnrender company_path 永远无法到达。
  • 这会帮助return redirect_to @companies.first if @count == 1
  • @Sculper 我有一个 return 因为我必须先显示结果然后执行弹出窗口
  • 谢谢@Athar。这可能是一个很好的解决方案,但在我的表演动作中,我正在执行第二个查询。我会将我的表演动作添加到问题中。
  • 好的,如果您为公司呈现显示页面视图,则 url 将保持为 /companies,这看起来不太好,但如果您重定向到显示操作,则会产生额外的搜索查询开销。你可以决定你应该去哪一个。如果您需要在不执行操作的情况下呈现显示页面。我想您可能需要在此if @companies.count == 1 之后添加此@company = @companies.first,然后在render company_path 并在渲染company_path 后返回。

标签: ruby-on-rails ruby actioncontroller elasticsearch-rails


【解决方案1】:

返回肯定会杀死你,但你试图渲染/重定向到特定资源的路径而不指定资源。我尝试了一些可能对你更有效的方法:

class MyController
  before_action :find_companies, only: :index
  before_action :find_company, only: :show
  before_action :show_company_if_matched, only: :index

  def index
    # do whatever you were doing here...
  end

  def show
    respond_to do |format|
      format.html # show.html.erb
      format.js # show.js.erb
      format.json { render json: @company }
    end
    # more code 
  end

  private

  def find_companies
    @companies = Company.search(params[:query]).results
  end

  def find_company
    client = Elasticsearch::Client.new host:'127.0.0.1:9200', log: true
    response = client.search index: 'companies', body: {query: { match: {_id: params[:id]} } }
    @company = response['hits']['hits'][0]['_source']
  end

  def show_company_if_matched
    redirect_to company_path(@comapnies.first) if @companies.total == 1
  end
end

编辑:更新为包含显示操作

【讨论】:

  • 谢谢。这是一个很好的方法,如果我不会在显示操作中执行第二个查询。检查我更新的代码。
【解决方案2】:

这是正确的语法:

def index
 @companies = Company.search(params[:query]).results
 @count = @companies.total
 if @count == 1
   render company_path # no params ?
   return
 else
   redirect_to root_path
   return
 end
end

在渲染或重定向后使用 return 是一种很好的做法,因为在某些情况下 'render' 或 'redirect_to' 不会执行 'return'(参见:最佳实践 ruby​​)

【讨论】:

  • 我不怀疑你,但你有引用吗?我的理解是,最“有条理”的方法是不显式地从控制器返回,除非在重定向或渲染之后有更多的控制流。
  • 是的,airbnb best practice。这条规则来自他们的一个会议,但我不知道是哪一个对不起。
【解决方案3】:

从您的控制器中删除 return。如果我理解了您的问题,这应该会导致您正在寻找的行为:

 if @count == 1
   render company_path  
 else
   # Do something else
 end

如果控制器中有后续代码不想执行,可以如下渲染返回:

 if @count == 1
   render company_path and return
 else
   # Do something else
 end

【讨论】:

  • 我必须先返回结果然后执行弹出(显示操作)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2014-09-23
  • 2019-09-30
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多