Mvc praktyka

[quote]Struktura bazy:

tabela: News

pola: id, title, description[/quote]

[quote]Kontroler bloga (wyswietlanie news)

class BlogController < ApplicationController

def index
@news = New.find_news
end

def czytaj
@news = New.zbliz(params[:id])
end
end[/quote]

[quote]Kontroler panelu admina(dodawanie news)

class AdminController < ApplicationController

def dodaj
if request.post?
@news = New.new params[:new]
@news.save
redirect_to :action => ‘index’, :controller => ‘blog’
end
end
end[/quote]

[quote]Model tabeli news

class New < ActiveRecord::Base
def self.find_news
find(:all, :order => “title”)
end

def self.zbliz(id)
find(id)
end

end[/quote]
Widokow nie wklejam bo sa raczej nieistotne

Pytania:

  1. Czy dopuszczalne jest zapisywanie czegos do bazy w kontrolerze czy powinenem w admin controler napisac;

def dodaj
if request.post?
wywolanie metody z modelu(params[:id])
redirect_to :action => ‘index’, :controller => ‘blog’
end
end

i dopiero z poziomu modelu zapisac nowy artykul do bazy

  1. Czy mozna skrocic ten zapis @news = New.zbliz(params[:id])

tzn nie wysylac parametru params[:id] tylko cos w postaci @news = new.zbliz i wtedy jakos odczytac w modelu te params[:id]

Nie zwracajcie uwagi na niezabezpieczone zapytania itp poniewaz napisalem to jak najprosciej zebyscie latwo mogli zrozumiec o co mi chodzi

odp 1. Tak :slight_smile:

Tylko po co ci metody New#find_news i New#zliz ? Według mnie są kompletnie niepotrzebne, możesz wywoływać New.find(:all), New.find(params[:id]) w kontrolerze.

[quote=lewy313]Pytania:

  1. Czy dopuszczalne jest zapisywanie czegos do bazy w kontrolerze czy powinenem w admin controler napisac;

def dodaj
if request.post?
wywolanie metody z modelu(params[:id])
redirect_to :action => ‘index’, :controller => ‘blog’
end
end

i dopiero z poziomu modelu zapisac nowy artykul do bazy[/quote]
Dopuszczalne a nawet zalecane, bo .save zwraca true jeśli zapisywanie się powiodło i false jeśli wystąpiły błędy, czyli if @news.save success else failure etc.

[quote=lewy313]2. Czy mozna skrocic ten zapis @news = New.zbliz(params[:id])

tzn nie wysylac parametru params[:id] tylko cos w postaci @news = new.zbliz i wtedy jakos odczytac w modelu te params[:id][/quote]
Po pierwsze nie używaj polskich nazw zmiennych, akcji, kontrolerów etc. Albo korzystasz z angielskojęzycznego framework’a i masz ujednolicony kod albo piszesz swój framework w którym wszystko jest po polsku. Taki miks wywołuje po jakimś czasie ból głowy.
Po drugie liczba pojedyncza od news (wiadomości) to news albo news_item więc twoja klasa powinna się nazywać class News < ActiveRecord::Base
Po trzecie po co Ci metoda zbliz która tak naprawdę wywołuje .find i nic więcej nie robi ?

Czyli powinienem napisac tak ?

[quote]class BlogController < ApplicationController

def index
@news = New.find(:all, :order => “title”)
end

def czytaj
@news = New.find(params[:id])
end
end[/quote]
Kiedy powinienem uzywac modeli ?

Co by sie stalo jezeli wywolalbym to w modelu. I skad mam wiedziec ze zapis do bazy danych powinen byc w kontrolerze a nie w modelu

Fat model, skinny controller. Gruby model, cienki kontroler. W kontrolerze nie powinno być logiki, tylko przyjęcie requestu i jego obsłużenie za pomocą metod dostępnych z modelach takich jak np. save czy inne które zdefiniujesz. Poszukaj w necie właśnie o tej zasanie ,fat model, skinny controller’’. Modele mają ci dać interfejs do operowania na bazie danych (to daje ci ActiveRecord). Popatrz też co to jest CRUD.