Mam pewien kłopot z frameworkiem ROR 3.2.6 (Ruby 1.9.3-p194)
Robię przykład/tutorial z: “Ruby on Rails Tutorial Part 6 - CRUD - Create - Save Method” na Youtube.pl
Dla: “<%= form_for @post do |local| %><% end %>” a konkretnie dla “form_for”,
zlokalizowanego w Showing /var/www/blog/app/views/post/new.html.erb where line #2
Mam błąd: NoMethodError in Post#new
Showing /var/www/blog/app/views/post/new.html.erb where line #2 raised:
undefined method `posts_path’ for #<#Class:0xb54761c4:0x93eda9c>
Wydaje mi się, że zrobiłem wszystko dobrze i uważnie, jak tutorial wskazuje. Jak dotrzeć do metod i klasy z której korzysta “form_for” i skąd te dziwne błędy, ?
Bo pisanie form_for OBIEKT bez podawania ścieżki uruchamia REST-ową magiczną machinę Railsów. To nie jest fajne dla początkującego, ale wszyscy się uparli tak pisać tutoriale.
“uruchamia REST-ową magiczną machinę Railsów”
nawykłem z innych języków że lubię wiedzieć co się dzieje za kurtyną
routes.rb:
Blog::Application.routes.draw do
resources :post
#komentarze
end
Wybaczcie mi za nadgorliwość, ale wkleję jeszcze to:
controllers/post_controller.rb:
class PostController < ApplicationController
def index @post_for_index = Post.all
end
def show @post_for_show = Post.find(params[:id])
end
def new @post = Post.new
end
def edit
hmmm. Nie wiem dlaczego próbuje odwołać się do posts_path zamiast post_path. Wszystkie zmienne/obiekty/pliki jakie stworzyłem - nazwałem w liczbie pojedynczej.
Nie miałem pojęcia, że ROR narzuca mi konwencję nazewnictwa plików i obiektów, tzn. że to ma się nazywać tak a nie inaczej, trochę to dziwne dla mnie. Dlaczego ROR narzuca mi konwencję: to ma się nazywać post, a tamto posts? Skąd ROR może wiedzieć co chcę stworzyć, a jeśli chcę nazwać po polsku wiadomosc i wiadomosci?
Railsy działają według pewnych konwencji - jeżeli twój model nazywa się Post, to twój kontroler - PostsController, twoje widoki będą w views/posts a url do kontrolera to /posts/ itd. itd. Same z siebie wtedy wiedzą gdzie czego szukać.
No i nie chodzi tylko o framework. Kiedy nowy programista wchodzi do projektu też wie gdzie, co i jak bo wszystkie railsowe appki wyglądają mniej więcej tak samo.
Nie jest to żaden przymus, tylko pewna… wskazówka - “rób tak, a będzie ci łatwiej i większość rzeczy będzie działać ootb”
Dlaczego właściwie “_post”, a nie po prostu “post”?
Zauważ, że w metodzie link_to drugi argument odpowiedzialny jest za ścieżkę - jak widzisz - w obu przypadkach (show i destroy) drugi argument jest jest taki sam, co jest w tym zatem dziwnego?
A do edit jest inaczej - bo i “domyślna”(restful) ścieżka do edytowania zasobu jest inna niż do jego pokazywania, czy usuwania - co w sumie nie powinno dziwić.
Poprawiłem post powyższy, żeby być lepiej zrozumianym, więc jeśli chodzi o show i destroy akcja jest ta sama, w url przekazywane jest id.
Dlaczego więc: w jednym przypadku :method => :delete, a w drugim _post ?
Jak to w PHP, lokalne zmnienne pisało się dodając _
Nie, akcja nie jest ta sama. Przy pokazywaniu wywoływana jest akcja show, przy usuwaniu - delete. Natomiast to, co przekazujesz jako :method, jest zupełnie czym innym - to jest metoda protokołu http. I tak - domyślnie link_to tworzy link z metodą get - jak odpalisz sobie rake routes, to zobaczysz, że właśnie get /posts/:id prowadzi do Posts#show. Natomiast delete /posts/:id prowadzi do akcji delete - dlatego też przy linku do usuwania musisz jawnie określić, że link powinien posłużyć się metodą delete.
Poza tym, przecież w obydwu przekazujesz “_post”.