2016-01-06 3 views
0

Я разрабатываю приложение rails, в котором есть контакты, которым назначена категория при создании. Приложение содержит 16 категорий. Все пины отображаются на главной странице индекса (кроме категории 16), и пользователь может щелкнуть Pin, который приведет их на страницу показа @Pin. На странице «Показать» есть @Pin и случайный контакт, выбранный из всех контактов в db (кроме категории 16). Указанные выше действия определены в контроллере контактов и функционируют без ошибок.Условный оператор не работает Rails 4

Проблема заключается в том, что, когда выбрана категория 16, и пользователь переходит к странице показа Pins, случайный контакт должен быть Pin из категории 16 Only, но он выбирается из всех контактов в db!

Я установил переменные и условные утверждения в индексе и покажу действия для достижения вышеуказанного, пожалуйста, проверьте мои комментарии в show-action диспетчера контактов. Проблемный код сохраняется при комментировании ==== ЧТО-ТО НЕПРАВИЛЬНО! ====

Пожалуйста, помогите мне относительно новичок в рельсах. Я не уверен, что я делаю неправильно, я потратил часы, пытаясь разного рода, но ничего не сработало ,

индекс pins_controller действия

def index 
if params[:category].blank? 
    @restricted = Category.find(16) # category id 16 set as var @restricted used to exclude cat 16 from index page in line below. 
    @pins = Pin.where.not(category: @restricted).all.order("created_at DESC").paginate(page: params[:page], per_page: 20) 
else 
    @category_id = Category.find_by(name: params[:category]).id 
    @pins = Pin.where(category_id: @category_id).order("created_at DESC").paginate(page: params[:page], per_page: 20) 
end 

pins_controller шоу-действие ПРОБЛЕМА

def show 
@pin.increment_view_count 
@show_main_cat = Category.where.not(16) # all categories except category id 16 set as var @show_main_cat 
if @show_main_cat.present? 
    @restricted = Category.find(16) # category id 16 set as var @restricted. 
    @random_pin = Pin.where.not(id: @pin, category: @restricted).order("RANDOM()").first # select random pin from all categories except 16 + not @pin. 
end 
@show_restricted_cat = Category.find(16) # category 16 set as var @show_restricted_cat < ==========SOMETHING WRONG!============== 
if @show_restricted_cat.present? 
    @restricted = Category.where.not(16) # all categories except 16 set as var @restricted. 
    @random_pin = Pin.where.not(id: @pin, category: @restricted).order("RANDOM()").first # Only select random pin from category 16 + not @pin. 
end 

@reviews = Review.where(pin_id: @pin.id).order("created_at DESC").limit(5) 
if @reviews.blank? 
    @avg_review = 0 
else 
    @avg_review = @reviews.average(:rating).round(2) 
end 
+0

Я подозреваю, что вы имеете в виду 'where.not (id: 16)' вместо 'where.not (16)'. –

ответ

1

Эта линия не то, что вы ожидали

@random_pin = Pin.where.not(id: @pin, category: @restricted).order("RANDOM()").first # Only select random pin from category 16 + not @pin. 

Он будет выбрать случайный контакт из категории 16 ИЛИ id not @pin (Что вы ожидаете Я думаю, из категории 16 И id not @pin). Измените его на:

@random_pin = Pin.where.not(category: @restricted).where.not(id: @pin).order("RANDOM()").first 

Удачи!

+0

Хорошо, вышеприведенное предложение состоит в том, как выбрать случайный Pin, который не является категорией 16, если вы просматриваете Pin (show) с идентификатором категории, отличным от 16. Это не проблема, как бы я ни пытался предложить where.not (id : 16) и что возвращенная ошибка «не может передать хэш целому числу». Во всяком случае, мой where.not (16) работал нормально. ПРОБЛЕМА Если пользователь выбирает категорию 16 и переходит на страницу показа (на пинте с кошкой 16), случайный вывод должен ТОЛЬКО быть из категории 16. С другой стороны (если пользователь выбирает вывод любой кошки, кроме 16 случайных контакт должен быть НЕ 16) работает нормально. –

+0

Ах, ну, так что ваш '@ limited' - это все категории, кроме 16? Поэтому я обновлю ответ –

+0

Нет, это так, если 'show_main_cat.present? 'ограничено категория 16. Если' show_restricted_cat.present? «Ограничено - все категории, кроме 16. Более подробно рассмотрите действие шоу. –

Смежные вопросы