Вывод статей с published=1


(МАКСИМ МАЙОРОВ) #11

http://guides.rubyonrails.org

Эта?


(МАКСИМ МАЙОРОВ) #12

Сделал так:

  def show
    if Post.find(params[:id]).published?
    @post = Post.find(params[:id])
  else
    redirect_to posts_url
  end
  end

и в модели:

scope :published, -> { where published: 1 }

Работает, но похоже на говнокод.


(Виктор) #13

Ну смотри, ты хотел, чтобы не получалось просмотреть неопубликованную статью, изменив адрес.
Ты этого добился, когда переходишь на url неопубликованной статьи вылезает ошибка “среди опубликованных статей статьи с id=16 не найдено”. Или ты хотел получить что-то другое?

Для твоей реализации scope в модели тебе и не нужен. Да и мне кажется, для show фильтровать, а потом в отфильтрованном искать, это тоже не очень хороший путь.


(МАКСИМ МАЙОРОВ) #14

Нет, всё работает как надо, но этот кусок:

@post = Post.find(params[:id])

уже встречается:

  def set_post
      @post = Post.find(params[:id])
    end

Кажется, что можно сделать короче код, но, опыта не хватает понять как.


(МАКСИМ МАЙОРОВ) #15

Есть ещё такой контроллер:

class TagsController < ApplicationController

	def show
		@tag = Tag.find_by(name: params[:id])
		@posts = @tag.posts.published
	end

end

На published не ругается, эта область видимости, не знаю, правильно ли назвал, объявлена в модели post. Но это не работает. Получается, что на статью по id перейти не могу, index её тоже не показывает, но по тегу её увидеть можно, есть ссылка на статью, но увидеть её опять же нельзя, а задумано не так.


(Виктор) #16

Тогда так.

def show
  set_post
  redirect_to posts_url if @post.nil?
end

protected

def set_post
  @post = Post.find_by(id: params[:id])
end

(Виктор) #17

Когда вы говорите, что по тегу ее можно увидеть, что вы имеете ввиду?
В переменную @posts она не попадает.
“Есть ссылка на статью, но увидеть ее нельзя”, что вы имеете ввиду?

Опишите, как оно должно работать по задумке?


(МАКСИМ МАЙОРОВ) #18

Контроллер posts_controller выводит как надо, index не выводит статью, по id после слеша, на статью не попасть. Есть ещё один контроллер, tags_controller, он выводит статьи по тегам, присвоенным статье во время создания, в отдельной вьюхе. У него один экшен:

class TagsController < ApplicationController

	def show
		@tag = Tag.find_by(name: params[:id])
		@posts = @tag.posts
	end

end

Мне надо дописать в этом экшене что то, что бы статьи не было в выводе, если published=0.
Надеюсь, так яснее картина.


(Виктор) #19

вы зачем убрали? С ним не будет выводить, если, как вы говорите, скоуп у вас есть в модели.

scope :published, -> { where published: 1 }


(МАКСИМ МАЙОРОВ) #20

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


(Виктор) #21

Не работает как? Не выводит вообще статьи?


(МАКСИМ МАЙОРОВ) #22

Выводит статьи как надо posts_controller, его можно пока не трогать. Мне надо что бы tags_controller не выводил статью, если published=0.


(Виктор) #23

При @posts = @tag.posts.published он выводит?


(МАКСИМ МАЙОРОВ) #24

published я дописал, но это ничего не меняет в выводе( выводятся все статьи, включая те, что выводить не надо), хотя и не вызывает ошибки.


(Виктор) #25

Не проверял, может так оно и не работает.
Ну тогда…
@posts = @tag.posts.where(published: 1)
Чего делать-то.
И тот кусок, что выше я рисовал, (Вывод статей с published=1) в контроллер поста.
Хотя, в итоге все равно придется ставить pundit или cancancan.


(Kvokka) #26

есть scope для того, чтобы DRYить модели и не повторять одно и то же
ожидайте в следующей серии NoMethodError: undefined method 'posts' for nil:NilClass :wink:


(Виктор) #27

Про scope было в прошлой серии же.

Ясно дело, что со scope (соскоб) более правильно.
Максим говорит, что @posts = @tag.posts.published не работает, хотя – должно, как по мне.
Предложил вот альтернативный путь (костыль).


(Kvokka) #28

я вообще не понял всей это переписки.
ведь можно же кинуться логом ошибки, если "сложна, сложна"
а так получается уже даже не смешно.
это как на адронном коллайдере неисправность “не включается” чинить. хотя, может это и к лучшему, что не включается :wink:


(Виктор) #29

Да нету ошибки.

В модели Post

scope :published, -> { where published: 1 }

В контроллере TagContoller

@posts = @tag.posts.published

В итоге, в @posts, со слов топикстартера, есть посты у которых published 0.

Ну, не знаю.


(МАКСИМ МАЙОРОВ) #30

Всё именно так и сделано, но published=0 в выводе есть.

А это зачем? Есть Devise