Jak sprawdzić controller w devise?

%title - if controller = @posts = 'Aktualności - SKNG Ekorozwój' - else = @pagetitle || 'SKNG Ekorozwój - ' + @page.title || 'Zle'

undefined method `title' for nil:NilClass

Witam, mam taką instrukcję warunkową.
Używam też systemu logowania devise. Jak w devise się nazywa się controler? Lub jak zmienić tą instrukcję, żeby działała z devise.

Nie wiem czy Devise ma tutaj znaczenie, w railsach 3 uzywa sie controller_name i action_name, np if controller_name == “posts”.

znalazłem -> controller_name == “registrations” i controller_name == “sessions”

Mam tylko jeszcze jeden problem, nie wiem dlaczego działa to tylko w poniższej konfiguracji:

[code=ruby] %title
- if controller_name == “registrations” or controller_name == “sessions”
= “Zaloguj się lub zarejestruj - SKNG Ekorozwój”
- else
- if controller_name == “posts”
= “Aktualności”
-# -s"

    = "Aktualności"
  - else
    = @pagetitle || 'SKNG Ekorozwój - ' + @page.title || 'Zle'[/code]

a w tej nie

%title - if controller_name == "registrations" or controller_name == "sessions" = "Zaloguj się lub zarejestruj - SKNG Ekorozwój" - else - if controller_name == "posts" = "Aktualności" - else = @pagetitle || 'SKNG Ekorozwój - ' + @page.title || 'Zle'

A co powiesz na to, żeby kontrolery registrations i sessions miały osobny plik layoutu? Np.

class RegistrationsController < ApplicationController layout "registration" end
Po czym w osobnym layoucie definiujesz inny tytuł.

Co dokładnie chcesz osiągnąć ?
W tym drugim przykładzie masz źle umieszczone else. Wydaje mi się, ze chcesz pewnie użyć tutaj elsif.
Do tego @page.title nie zawsze zadziała jeśli nie będziesz mieć obiektu @page.
Polecam Ci przenieść też całą tę logikę do jakiegoś helpera.

Ja jeszcze powiem, że używasz operatorów ‘and’/‘or’ niezgodnie z przeznaczeniem.
Nie można ich po prostu zamieniać z && oraz ||.
Nie tylko mają one inne priorytety ale też inne zastosowanie.

Czytałem o tym kiedyś ciekawy artykuł ale już nie mogę znaleźć. W każdym razie:

costam = 12 and cos_innego

Należy czytać nie jak "przypisz do costam wynik operacji ‘oraz’ na ‘12’ i ‘cos_innego’ " tylko
"Przypisz 12 do ‘costam’ i zrób ‘coś innego’ . "

Zwykle używa się tego w stylu

redirect_to :back and return

albo

is_enough_memory? or exit

Tylko to znalazłem:

Reasumując and/or są do sterowania programem a nie sprawdzania prawda/fałsz i wywodzą się z perla.
Ten artykuł którego nie mogę znaleźć dużo lepiej to tłumaczył ale mam nadzieję, że jakoś to wyjaśniłem.

A czemu nie ustawić tego w kontrolerze po prostu? Tzn. w kontrolerze ApplicationController ustawiasz domyślny tytuł w metodzie powiedzmy “set_title”,
a jeśli chcesz go zmienić, to nadpisujesz tę metodą dla konkretnego przypadku, np.

[code=ruby]class ApplicationController < ActionController::Base
before_filter :set_title
protected
def set_title
@title = “Ekorozwój”
end
end

class PostsController < ApplicationController
protected
def set_title
@title = “Aktualności”
end
end[/code]
Można też zastosować inny layout lub “content_for”, ale to rozwiązanie wydaje mi się najlepsze jeśli tytuł zależy wyłącznie od kontrolera (a nie konkretnej akcji).

Może dlatego, że niektórzy puryści uznaliby to za złamanie mvc.

paneq możesz rozwinąć dlaczego?

Bo zajmujesz się widokiem w kontrolerze.

Zgadzam się z Paneqiem: kontroler nie służy od ustawiania detali widoków. Ustawienie tytułu to zadanie samych widoków, patrz: https://github.com/bragi/site_meta

Świetnie rozwiązał to RayanB w swoim nifty:scaffold można podpatrzeć i używać.

Mógłbyś bragi pokazać jakieś demo app z każdym ficzerem. W szczególności interesuje mnie sprawa breadcrumbs :slight_smile: Swoją drogą czy ktoś może mi powiedzieć jaka warstwa powinna się zajmować okruszkami :slight_smile: ? Dla mnie kontroler jest taką częścią aplikacji która wie skąd idziesz i dokąd zmierzasz i są pewne powody dla których mógłby się tym zająć a z drugiej strony nigdy mi to nie pasowało. Ale też w widoku odwoływanie się do różnych dość odległych miejsc danej aplikacji też mi się nigdy nie podobało.

A moze tak?

[code ruby]# /app/views/layouts/application.html.haml

%title= yield(:title)

/app/controllers/posts_controller.rb

class PostsController < ApplicationController
layout ‘posts’
end

/app/views/layouts/posts.html.haml

  • content_for(:title, “Example”)
    = render :file => ‘layouts/application’[/code]
    Nie sprawdzalem czy dziala, pisalem z glowy :wink:

Na takiej samej zasadzie jak w railsach rozwiązano obsługę “layoutu”, czy komunikatami typu “poprawnie zalogowano do systemu” - to przecież też należy do warstwy widoku, a jednak pojawia się w kontrolerze. Osobiście uważam, że MVC jak każdy wzorzec projektowy, pozwala uporać się z wieloma podstawowymi problemami, ale bardzo sztywne trzymanie się tych zasad (bo to nie jest MVC),
do mnie nie przemawia. Uzasadnienie powinno pokazywać, że takie rozwiązanie jest trudne w utrzymaniu, prowadzi do brzydkiego kodu lub jego duplikacji. Żadnej z tych rzeczy nie dostrzegam w tym rozwiązaniu. Jedyne co może budzić zastrzeżenia to zaśmiecanie przestrzeni nazw (@title jako “zmienna globalna”).