bresio
December 16, 2014, 1:11pm
1
Witam
Jest kontroler użytkownika
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
User ma kilka atrybutów: name, surname, itp.
W widoku bez problemu da się wyświetlić
user.name i user.surname
Chciałbym dodać swoją metodę, która zwróci mi ciąg user_name + " " + user.surname
W związku z tym, w users_helper.rb
module UsersHelper
def name_surname()
#tu będzie instrukcja do zwracania tego, co potrzebne.
end
end
Przy próbie pokazania widoku dostaję komunikat:
undefined method `name_surname' for #<User:0x007f0dd4594b68>
Próbowałem do users_controller.rb dodawać:
include UsersHelper
helper UsersHelper
Bez spodziewanego efektu.
Co robię źle?
Lypa
December 16, 2014, 1:16pm
2
A Twoja kolumna z nazwiskiem nie nazywa się czasem surname
, tak jak napisałeś wcześniej?
bresio
December 16, 2014, 1:41pm
3
kolumna z imieniem: name
kolumna z nazwiskiem: surname
Lypa
December 16, 2014, 1:50pm
4
A, już wiem gdzie robisz błąd. Twoją metodę name_surname
próbujesz wołać na instancji klasy User
zamiast na odbiorcy domyślnym w widoku.
pski
December 16, 2014, 1:52pm
5
Tej metody nie możesz wywołać na obiekcie user.
Mozesz ją wywołać np w widoku
name_surname(user)
bresio
December 17, 2014, 9:29am
6
Zaiste, w ten sposób działa.
Co zrobić, żeby taką metodę wywoływać na instancji klasy?
Podobnie jak mam user.new
, chciałbym móc zrobić user.name_surname
bresio
December 17, 2014, 10:20am
8
Wówczas dostaję błąd, o którym pisałem wcześniej:
undefined method `name_surname' for #<User:0x007f0dd4594b68>
mentero
December 17, 2014, 10:41am
9
W takim razie nie dodajesz jej do klasy User. Twoja klasa User znajduje się w folderze ‘models’.
Jeżeli nie chcesz rozdmuchiwać klasy modelu (a powinieneś nie chcieć), to zawsze można też usera opakować w jakiś dekorator/presenter, ale polecam zostawić sobie takie techniki na moment gdy już poznasz trochę jak działa framework.
bresio
December 17, 2014, 10:51am
10
Faktycznie, dodawałem ją do kontrolera users_controller.rb
. Zdawało się to logiczne.