Wyświetlanie postów konkretnego usera

Cześć!
Od pewnego czasu próbuję swoich sił w RoR i podczas ćwiczeń nad pewnym projektem natrafiłem na pewien problem, na który nie mogę znaleźć odpowiedzi w G ani tu na forum.

Korzystam z gemu devise do rejestracji użytkowników. Chcę, wyciągnąć posty konkretnego użytkownika, ale nie tego zalogowanego bo z tym sobie poradziłem. Chcę, aby po kliknięciu w autora wpisu, pojawiała się lista z jego wszystkimi wpisami.

Poniżej controller z postami:

`class PinsController < ApplicationController
before_action :find_pin, only: [:show, :edit, :update, :destroy, :upvote]
before_action :authenticate_user!, except: [:index, :show]
before_action :pin_owner, only: [:edit, :update, :destroy]

def index
@pins = Pin.all.order(“created_at DESC”)
end

def show
end

def new
#@pin = Pin.new
@pin = current_user.pins.build
end

def create
#@pin = Pin.new(pin_params)
@pin = current_user.pins.build(pin_params)

if @pin.save
  redirect_to @pin, notice: "Successfully created new Pin!"
else
  render 'new'
end

end

def edit
end

Aby zablokować edycję i usuwanie pinów innym użytkownikom niż autor

def pin_owner
unless @pin.user_id == current_user.id
flash[:notice] = ‘Access denied as you are not owner of this Pin’
redirect_to pins_path
end
end

def userpin
@pins = current_user.pins
end

def mypins
@pins = current_user.pins
@user = current_user
end

def update
if @pin.update(pin_params)
redirect_to @pin, notice: “Pin was successfully updated!”
else
render ‘edit’
end
end

def destroy
@pin.destroy
redirect_to root_path
end

def upvote
@pin.upvote_by current_user
redirect_to :back
end

private
def pin_params
params.require(:pin).permit(:title, :description, :image)
end

def find_pin
@pin = Pin.find(params[:id])
end

end
`

Metoda mypins odpowiada za wyświetlanie wszystkich wpisów zalogowanego użytkownika, natomiast userpin docelowo ma wyświetlać listę wpisów konkretnego użytkownika.

Model pin posiada belongs_to :user, a model user has_many :pins.

Plik routes.rb:
`Rails.application.routes.draw do
devise_for :users
resources :pins do
member do
put “like”, to: “pins#upvote”
end
end

root “pins#index”
get ‘userpin’ => ‘pins#userpin’
get ‘mypins’ => ‘pins#mypins’
end
`

Czy ktoś podpowie jak rozwiązać tę sprawę?

def userpins
  @pins = User.find(params[:user]).pins
end

#routes.rb
get '/userpin/:user', to: 'pins#userpin' # :user to id usera z bazy

Coś takiego?

Coś podobnego wcześniej próbowałem, ale bez powodzenia.

A jak teraz zrobić link_to dla poszczególnych userów?

# w kontrolerze
@users = User.all
# w widoku
for user in @users
  link_to "Pins", controller: "PinsController", action: "userpins", user: user
end

Coś mniej więcej takiego.

Dzięki za szczere chęci, ale nie udało mi się jeszcze tego rozwiązać z Twoimi podpowiedziami.

Swój kod piszę w haml i linki z większą ilością parametrów sprawiają trudności.

możesz jeszcze tutaj dospiasć , as: :user_pins i później w widoku link_to "Pins", user_pings(user: user)

Tak też zrobiłem, ale wyskakuje mi błąd na głównej:
undefined local variable or method 'user'

A jak się nazywa twój model użytkownika z devise?
Pokaż też linię w której ci wywala błąd.

Model użytkownika nazywa się User.
Linijka odpowiedzialna za wyświetlanie linka do omawianych postów użytkownika:
= link_to "Pins", user_pins(user: user)

a tutaj linijka w routingu:
get '/userpin/:user' => 'pins#userpin', as: :user_pins

A nad tą linijką z link masz?

- for user in @users

I czy w kontrolerze masz?

@users = User.all

Tak, dokładnie - dodałem je wcześniej.

A jak w konsoli railsowej
rails c
z linii komend, wpiszesz

User.all

To co Ci się wyświetla?

Wszystkich userów

To w takim razie jeżeli masz błąd
undefined local variable or method 'user'
To jest to problem z wcięciami, bo nic innego mi do głowy nie przychodzi.

Rzeczywiście, był problem z jednym wcięciem.
- for user in @users (wcięcie)= link_to "Pins", user_pins(user: user)

Błąd natomiast wyskakuje nadal, ale inny:
undefined method 'user_pins' for #<#<Class:0x0000000ddc5f70>:0x0000000e0f9d68>

user_pins jest zdefiniowane w routingu:
get '/userpin/:user' => 'pins#userpin', as: :user_pins

Jeśli wcięcie usunę to błąd jest taki:
syntax error, unexpected keyword_ensure, expecting keyword_end ...:Util.html_safe(_erbout);ensure;@haml_buffer = @haml_buffer....

w link_to dodaj _path do linku:
link_to "Pins", user_pins_path(user: user)

sic! rzeczywiście, to ten błąd :slight_smile:
Natomiast teraz te dwie linijki:
- for user in @users (wcięcie)= link_to pin.user.email, user_pins_path(user: user)
wyświetlają wszystkich trzech użytkowników (przy każdym poście 3x anchor autora wpisu, ale inny url - userpin/1, userpin/2, itd).

Plik userpin zawiera dwie linijki, które mają wyświetlać wpisy danego autora, ale teraz wyświetlają wszystkie posty zalogowanego aktualnie użytkownika:
- @pins.each do |pin| (wcięcie)%ul.list-group (wcięcie)(wcięcie)%li.list-group-item= link_to pin.title, pin

gdzieś tam u góry napisałeś
@pins = current_user.pins
czyli do @pins pobierasz pinsy aktualnego usera.

Rozwiązałem problem z wyświetlaniem wpisów konkretnego usera.

userpin.html.haml
- @user.pins.each do |pin| (wcięcie)%ul.list-group (wcięcie)(wcięcie)%li.list-group-item= link_to pin.title, pin

Mam jeszcze tylko problem z wyświetlaniem maili użytkowników na stronie głównej.
Pod każdym postem wyświetlają się wszystkie maile wszystkich użytkowników (z właściwymi odnośnikami). To normalne przy tym zastosowaniu each po userach, ale kombinuję teraz żeby wyświetlało tylko jednego usera-autora wpisu.

Poniżej plik index.html.haml
#pins.transitions-enabled ()- @pins.each do |pin| ()().box.panel.panel-default ()()()= link_to (image_tag pin.image.url), pin ()()().panel-body ()()()()%h2= link_to pin.title, pin ()()()()%p.user ()()()()Author: ()()()()- @users.each do |user| ()()()()()= link_to pin.user.email, user_pins_path(user: user)

() oznacza wcięcie :slight_smile:

= link_to @pin.user.email, user_pins_path(user: @pin.user) ?