如果找到一条记录,则执行显示操作

If one record found execute show action

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

我要显示索引操作的搜索结果。通过显示操作在弹出窗口中显示每条单独的记录。

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

这是我已经尝试过的。

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

结束

好像是 return, redirect_to 或者 render一次动作都打不好

还有其他想法吗?

更新 添加了表演动作

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

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

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

如果controller中有后续代码不想执行,可以render and return如下:

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

这是正确的语法:

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)

return 肯定会让您丧命,但您正试图在不指定资源的情况下呈现/重定向到特定资源的路径。我尝试了一些可能对您更好的方法:

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

编辑: 已更新以包含表演动作