0

所以我试图让用户从我认为的链接中对一组食谱进行排序:

<%= link_to "Score", recipes_sort_path, :order => 'score' %>

我将参数“score”发送到我的控制器方法“sort”,如下所示:

  def sort
    if (params[:order] == 'score')
      @recipes.sort_by(&:score)
    end

    respond_to do |format|
      format.html { redirect_to recipes_path }
      format.json { render json: @recipe }
    end
  end

它重定向到以下索引方法:

  def index
    # If recipes already present, skip following
    if (!@recipes)
      if (params[:search] || params[:tag])
        @recipes = Recipe.search(params[:search], params[:tag])
      else
        @recipes = Recipe.all
      end
    end

    respond_to do |format|
      format.html 
      format.json { render json: @recipe }
    end
  end

这个想法是用排序列表重定向到索引视图并只渲染视图。我没有收到任何错误,但是当我单击链接时,页面重新加载但没有任何反应。

食谱类如下所示:

class Recipe < ActiveRecord::Base
  attr_accessible :instructions, :name, :slug, :score, :upvotes, :downvotes, :comments, :image

  has_and_belongs_to_many :ingredients
  has_and_belongs_to_many :tags
  has_many :comments  
  belongs_to :user
  delegate :name, :to => :user, :prefix => :user, :allow_nil => true
  mount_uploader :image, ImageUploader

  validates :name, :presence => true

  def score
    score = (self.upvotes - self.downvotes)
  end
end

我在这里做错了什么?

4

2 回答 2

2

还有第三个选项(前两个来自 ckruse 的回答)。您可以从排序操作呈现索引模板

def sort
  if (params[:order] == 'score')
    @recipes.sort_by!(&:score)
  end

  respond_to do |format|
    format.html { render :index }
    format.json { render json: @recipe }
  end
end

这将在排序操作中使用@recipes 时使用索引模板。您还保存了一个请求,因为您没有重定向。

我想评论的另一件事是链接。它应该是

<%= link_to "Score", recipes_sort_path(:order => 'score') %>

更新:获取@recipes。尽可能地,我希望 sql 进行排序,这就是我要在这里做的事情。

def sort
  @recipes = Recipe

  if params[:order] == 'score'
    @recipes = @recipes.order('upvotes - downvotes')
  end

  respond_to do |format|
    format.html { render :index }
    format.json { render json: @recipe }
  end
end
于 2013-02-22T12:49:46.857 回答
0

首先:sort_by不是“破坏性的”,它返回一个新数组。您可能想要使用或保存intosort_by!的返回值。sort_by@recipes

第二:你根本不会在你的sort动作中渲染任何东西。如果您发布了所有代码,即使@recipes是空的。你可以做两件事:

  • sort像在方法中一样检索方法中的数据index,然后调用render :index
  • 对你的方法进行排序,index根本不要使用任何sort方法。您可以将多个 URI 路由到同一个操作。
于 2013-02-22T12:23:53.170 回答