2015-05-28 5 views
0

Я использую Rails 4 с камнем Импрессиониста, чтобы получить количество просмотров моих статей.Ссылка на заказ Индекс Rails 4

На моей странице индекса У меня есть ссылка с надписью «Самой популярной»

У меня также есть доступ к способу, который закажет статьи по количеству просмотров:

@articles = Article.order('impressions_count ASC') 

Что является лучшим способом заказывать индекс по показам_count, когда пользователь нажимает «самую популярную кнопку?». У меня возникли проблемы с поиском документации по этому вопросу.

Вот мой articles_controller.rb

class ArticlesController < ApplicationController 
    load_and_authorize_resource 
    before_action :set_article, only: [:show, :edit, :update, :destroy] 

    def index 
    if params[:q].present? 
     @articles = Article.search(params[:q], misspellings: {edit_distance: 1}, page: params[:page], per_page: 12) 
     @search = current_or_guest_user.searches.create!(query: params[:q], searched_at: Time.now) 
    else 
     @articles = Article.order('impressions_count ASC').page(params[:page]).per(12) 
     @search = current_or_guest_user.searches.create!(query: params[:q], searched_at: Time.now) 
    end 
    if @articles.blank? 
     return redirect_to request_path 
     @search = current_or_guest_user.searches.create!(query: params[:q], searched_at: Time.now) 
    end 
    get_query 
    end 

    def autocomplete 
    @articles = Article.search params[:term], autocomplete: true 
    render json: @articles 
    end 

    def search 
    @articles = Article.search params[:q], suggest: true, page: params[:page], per_page: 5 
    @search = current_or_guest_user.searches.create!(query: params[:q], searched_at: Time.now) 
    render 'index' 
    end 

    def show 
    impressionist(@article, nil, { unique: [:session_hash] }) 
    @skip_error = true 
    @subarticles = @article.subarticles.approved.order(:cached_votes_score => :desc) 
    if request.path != article_path(@article) 
     redirect_to @article, status: :moved_permanently 
    else 
     respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @article } 
     end 
    end 
    end 

    def new 
    end 

    def edit 
    end 

    def create 
    respond_to do |format| 
     if @article.save 
     format.html { redirect_to @article, notice: 'Article was successfully created.' } 
     format.json { render :show, status: :created, location: @article } 
     else 
     format.html { render :new } 
     format.json { render json: @article.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @article.update(article_params) 
     format.html { redirect_to @article, notice: 'Article was successfully updated.' } 
     format.json { render :show, status: :ok, location: @article } 
     else 
     format.html { render :edit } 
     format.json { render json: @article.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @article.destroy 
    respond_to do |format| 
     format.html { redirect_to articles_url, notice: 'Article was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_article 
     @article = Article.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def article_params 
     params.require(:article).permit(:title, :specific, :category, :aka, :image1, :image2, :video1, :video2) 
    end 

    def get_query 
     @userquery = params[:q] 
    end 
end 
+0

Что вы имеете в виду, указав только индекс? – Zakwan

+0

Оформление заказа: по успеху, когда кто-то нажимает на ссылку "самый популярный" – Kathan

+0

Только на странице показа статей. Этот метод «импрессионист» (@article, nil, {unique: [: session_hash]}) получает количество просмотров статей. – Kathan

ответ

1

Первая else положение в индексе заключается в следующем:

else 
    @articles = Article.order('impressions_count ASC').page(params[:page]).per(12) 

Именно поэтому вы получаете их сортируются по impressions_count. Просто избавитесь от него, чтобы вернуть их отсортированные по последнему слову.

else 
    @articles = Article.order(created_at: :desc).page(params[:page]).per(12) 

Вы должны установить свой «самый популярный», чтобы вернуть @articles переменную отсортированных по impressions_count, как вы делали в старом коде.

Вам нужно будет сделать ваши действия в контроллере, чтобы вернуть результаты, которые вы хотите, что-то вроде:

Добавить переменную в белый список:

def article_params 
    params.require(:article).permit(:title, :specific, :category, :aka, :image1, :image2, :video1, :video2, :imp_sort) 
end 

Затем в index действии вы можете добавить это в:

def index 
if params[:q].present? 
    @articles = Article.search(params[:q], misspellings: {edit_distance: 1}, page: params[:page], per_page: 12) 
    @search = current_or_guest_user.searches.create!(query: params[:q], searched_at: Time.now) 
else 
    if article_params[:imp_sort] 
    @articles = Article.order('impressions_count ASC').page(params[:page]).per(12) 
    else 
    @articles = Article.order(created_at: :desc).page(params[:page]).per(12) 
    end 
    @search = current_or_guest_user.searches.create!(query: params[:q], searched_at: Time.now) 
end 
if @articles.blank? 
    return redirect_to request_path 
    @search = current_or_guest_user.searches.create!(query: params[:q], searched_at: Time.now) 
end 
get_query 

конец

в вашем index.html.erb вам понадобится ваша ссылка:

<%= link_to "Sort by Impressions", articles_path(:imp_sort => true) %> 
+0

Это именно то, что я искал, большое спасибо. – Kathan