Избавление от фидов других пользователей - PullRequest
0 голосов
/ 25 января 2019

Я следовал руководству Hartl, чтобы создать ToDoList с системой тегов, также с помощью этого словаря и видео . До сегодняшнего дня мне все еще интересно, как работает код системы каналов, реализованный Hartl в Листинге 13.3 . В моем текущем приложении более простая версия до реализации тегов позволяет сохранять фид, наблюдаемый на домашней странице владельца самого микросообщений.

Правильный просмотр фида, который показывает только собственный пост Wrong after implementing tags И журнал всякий раз, когда я пытаюсь войти в первый раз.

  Rendered users/show.html.erb within layouts/application (36.7ms)
  Rendered layouts/_rails_default.html.erb (24.4ms)
  Rendered layouts/_shim.html.erb (0.3ms)
  Rendered layouts/_header.html.erb (0.7ms)
  Rendered layouts/_footer.html.erb (1.0ms)

Однако реализация тегов теперь приводит к отображению каналов всех пользователей.

Неправильно отображаемая версия

correct but pre-tagged

Вот журнал в моей командной строке, когда я впервые зашел на страницу входа в систему для системы тегов.

  Rendered collection of microposts/_micropost.html.erb [30 times] (80.7ms)
  CACHE  (0.0ms)  SELECT COUNT(*) FROM "microposts"
  Rendered shared/_feed.html.erb (86.8ms)
  Rendered static_pages/home.html.erb within layouts/application (138.2ms)
  Rendered layouts/_rails_default.html.erb (63.7ms)
  Rendered layouts/_shim.html.erb (0.3ms)
  Rendered layouts/_header.html.erb (1.3ms)
  Rendered layouts/_footer.html.erb (1.0ms)

Вот мой код контроллера:

MicropostsController

class MicropostsController < ApplicationController
  before_action :logged_in_user, only: [:index, :show, :create, :destroy]
  before_action :correct_user,   only: :destroy


  def index
    params[:tag] ? @microposts = Micropost.tagged_with(params[:tag]) : @microposts = Micropost.all
  end


  def show
    @micropost = Micropost.find(params[:id])
  end



  def create
    @micropost = current_user.microposts.build(micropost_params)
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to root_url
    else
      @feed_items = []
      render 'static_pages/home'
    end
  end

  def destroy
    @micropost.destroy
    flash[:success] = "You have deleted a task!"
    redirect_to request.referrer || root_url
  end

  private

    def micropost_params
      params.require(:micropost).permit(:content, :tag_list, :tag, 
        {tag_ids: [] }, :tag_ids)
    end

    def correct_user
      @micropost = current_user.microposts.find_by(id: params[:id])
      redirect_to root_url if @micropost.nil?
    end
end

SessionsController

class SessionsController < ApplicationController

  def new
  end

  def create
    @user = User.find_by(email: params[:session][:email].downcase)
    if (@user && @user.authenticate(params[:session][:password]))
      log_in @user
      flash[:success] = "Welcome back, #{@user.name}!"
      params[:session][:remember_me] == '1' ? remember(@user) : forget(@user)
      redirect_back_or root_path
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
    log_out if logged_in?
    redirect_to root_url
  end
end

StaticPagesController

class StaticPagesController < ApplicationController
  def home
    if logged_in?
      @new_micropost = Micropost.new
      @micropost  = current_user.microposts
      @feed_items = Micropost.all.paginate(page: params[:page])

    end 
  end

  def help
  end

  def about
  end

  def contact
  end
end

UsersController

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update, :destroy]
  before_action :correct_user,   only: [:edit, :update]
  before_action :admin_user,     only: [:destroy]


  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
  end

  def new
    @user = User.new
  end

  def index
    @users = User.paginate(page: params[:page])
  end


  def create
   @user = User.new(user_params)
   if @user.save
     log_in @user
     flash[:info] = "Welcome to the to-do app, #{@user.name}"
     redirect_to @user
   else
     render 'new'
   end
  end

  def admin
    @users = User.paginate(page: params[:page])
  end

  def destroy
    a = User.find(params[:id]).name
    User.find(params[:id]).destroy
    flash[:success] = "#{a} has been deleted!"
    redirect_to users_url
  end

  def admin_user
    redirect_to(root_url) unless current_user.admin?
  end

 def edit
   @user = User.find(params[:id])
 end

 def update
  @user = User.find(params[:id])
  if @user.update_attributes(user_params)
    flash[:success] = "Profile for @user.name has been updated"
    redirect_to(@user)
  else
    flash[:danger] = "Update Failed."
    render 'edit'
  end
end

  private
    def user_params
      params.require(:user).permit(:name, :email, :password,
                                  :password_confirmation, :admin)
    end
    def logged_in_user
      unless logged_in?
        store_location
        flash[:danger] = "You are not logged in. Please log in."
        redirect_to login_url
      end
    end

    def correct_user
      @user = User.find(params[:id])
      if !current_user?(@user)
        flash[:danger] = "You are not authorized to visit this page."
        redirect_to(root_url)
      end
    end
  end

microposts / index.html.erb

<h1>Filtered Micropost Page</h1>
<div class = "col-md-8 offset-2">
  <% @microposts.each do |micropost| %>
    <p><%= truncate(micropost.content, length: 50) %></p>
    <p><small>Tags: <%= raw micropost.tags.map(&:name).map { |t| link_to t, tag_path(t) }.join(', ') %></small</p>
        <span class="timestamp">
            Posted <%= time_ago_in_words(micropost.created_at) %> ago.
            <% if current_user?(micropost.user) %>
              <%= link_to "Done", micropost_path(micropost), method: :delete, data: { confirm: "Keep up the good work!" } %>
            <% end %>
        </span>
    <% end %>
</div>

Кто-нибудь знает, как решить проблему? Сообщите мне, если вам нужна дополнительная информация.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Из кода, которым вы поделились, я думаю, что ваша проблема в StaticPagesController, в действии home. Там вы получаете @feed_items следующим образом:

  @new_micropost = Micropost.new
  @micropost  = current_user.microposts
  @feed_items = Micropost.all.paginate(page: params[:page])

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

Так что я предполагаю, что это должно быть что-то вроде

  @feed_items = current_user.microposts.paginate(page: params[:page]) 

(не уверен, если вам нужна / используется переменная @micropost, потому что это кажется излишним / перекрывающимся) (также не уверен, как это связано с тегами, потому что я не вижу ссылок на теги в коде, который вы показали)

0 голосов
/ 25 января 2019

Вам необходимо добавить пользовательское условие к запросу в MicropostsController#index, например, используя current_user.microposts отношение

def index
  @microposts = current_user.microposts
  @microposts = @microposts.tagged_with(params[:tag]) if params[:tag]
end

Кстати, подобная область может быть полезна на страницах показа и обновления - в противном случае пользователи смогут просматривать и обновлять содержимое, принадлежащее другим пользователям.

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