Rails versie 1.2
Afgelopen week heeft David Heinemeier Hansson de release candidate 1 van de nieuwe versie van Rails bekend gemaakt. Versie 1.2 van het geweldige framework bevat een groot aantal updates.
Een overzicht van de wijzigingen aan de verschillende onderdelen van Rails kan je vinden op de weblog van Rails: nieuw in ActionPack, nieuw in ActiveRecord en nieuw in ActiveSupport.
Een grote aanpassing is de ondersteuning voor REST-full resources. Een simpel voorbeeld is hieronder te vinden:
-
class PeopleController @people.to_xml }
-
end
-
end
-
-
# GET /people/1
-
# GET /people/1.xml
-
def show
-
@person = Person.find(params[:id])
-
-
respond_to do |format|
-
format.html # show.rhtml
-
format.xml { render :xml => @person.to_xml }
-
end
-
end
-
-
# GET /people/new
-
def new
-
@person = Person.new
-
end
-
-
# GET /people/1;edit
-
def edit
-
@person = Person.find(params[:id])
-
end
-
-
# POST /people
-
# POST /people.xml
-
def create
-
@person = Person.new(params[:person])
-
-
respond_to do |format|
-
if @person.save
-
flash[:notice] = 'Person was successfully created.'
-
format.html { redirect_to person_path(@person) }
-
format.xml { head :created, :location => person_path(@person) }
-
else
-
format.html { render :action => "new" }
-
format.xml { render :xml => @person.errors.to_xml }
-
end
-
end
-
end
-
-
# PUT /people/1
-
# PUT /people/1.xml
-
def update
-
@person = Person.find(params[:id])
-
-
respond_to do |format|
-
if @person.update_attributes(params[:person])
-
flash[:notice] = 'Person was successfully updated.'
-
format.html { redirect_to person_path(@person) }
-
format.xml { head :ok }
-
else
-
format.html { render :action => "edit" }
-
format.xml { render :xml => @person.errors.to_xml }
-
end
-
end
-
end
-
-
# DELETE /people/1
-
# DELETE /people/1.xml
-
def destroy
-
@person = Person.find(params[:id])
-
@person.destroy
-
-
respond_to do |format|
-
format.html { redirect_to people_path }
-
format.xml { head :ok }
-
end
-
end
-
end
Door de HTTP method aan te passen kan je dus verschillende acties aanroepen binnen een controller. Dit zorgt voor nog nettere URL's dan al het geval was in Rails. Het bovenstaande voorbeeld is een scaffold voorbeeld dat Rails zelf voor je kan genereren met het volgende commando:
script/generate scaffold_resource
Doordat de meeste browsers geen ondersteuning hebben voor andere HTTP methoden dan GET en POST, moet Rails een omweg maken om dit toch te kunnen gebruiken. Daarom voegen ze aan formulieren die de PUT methode gebruiken een extra hidden field toe met de naam '_method' en de waarde PUT. In het framework lezen ze dit uit en baseren mede daarop de aan te roepen actie.
Tot zover geen probleem. Formulieren met extra velden is nog te overzien. Maar dan kom je bij een destroy methode die met de DELETE method aangeroepen kan worden. Meestal bereik je die actie door middel van een linkje. En daar voeg je niet zomaar even een veld aan toe, want dan ben je gelijk je nette URL's weer kwijt.
De link_to methode heeft een extra parameter method gekregen die je als volgt kunt gebruiken:
-
link_to 'Destroy', person_path(person), :confirm => 'Are you sure?', :method => :delete
En wat maakt Rails daar van:
-
<a href="/people/1" onclick="if (confirm('Are you sure?')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);f.submit(); };return false;">Destroy</a>
(Te)veel code voor een simpel linkje. Daarnaast zal onze grote vriend Google of de buurman zonder JavaScript gewoon op /people/1 uitkomen en dus nooit meer iets kunnen verwijderen. Conclusie is dat deze leuke techniek alleen bruikbaar is in backend situaties waarbij je eisen kunt stellen aan de omgeving van de gebruiker en Google niet zo snel langs zal komen.
Misschien moeten we dan toch maar de URL wat minder netjes willen hebben.
Volg Scriptorama via RSS!
Reageer ook!
Je wilt natuurlijk sowieso niet dat Google je delete-links spidert maar dat is niet helemaal het punt.
Ik lig niet echt wakker van mensen die Javascript uit hebben staan, maar wat ik wel wat ranzig is vind is dat ze de javascript code direct in de HTML code gevrot hebben kennelijk. Je kunt dit veel netter attachen.
Door Mathieu Kooiman
op 12.12.06 @ 9:46 am | Permalink
Als Google (of wie of wat ook) een ongewenste respons via GET kan indexeren dan lijkt me dat je site/applicatie wagenwijd open staat voor misbruik.
Rails gebruikt dus nog steeds inline JavaScript.
Dat kan ik niet rijmen met DHH die vaak hamert op 'code beauty' en semantiek.
Gelukkig zijn er initiatieven als http://www.ujs4rails.com/
Door Michel de Lange
op 12.12.06 @ 3:46 pm | Permalink
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>