smart | Webentwicklung
Alles rund um HTML5, PHP, WordPress & Co.

Ruby on Rails 4: Einführung in Strong Parameters

6. Juni 2013
Stephan
Ruby on Rails 4: Einführung in Strong Parameters

Derzeit arbeite ich seit längerer Zeit mal wieder mit Ruby on Rails und habe gleich mal mein Rails auf die aktuelle Version 4 (Rails 4 – Release Candidate 1) aktualisiert.

Wie immer gab es einige Änderungen und die für mich aufälligste war die Integration des Gems „Strong Parameters“ in Rails und einhergehend die Entfernung des Features attr_accessible.

In diesem Artikel zeige ich euch, was es mit „Strong Parameters“ auf sich hat.

Rails 3 attr_accessible

In Rails 3 sind die Attribute eines Models standardmäßig vor dem sogenannten „Mass Assignment“ geschützt (protected). Um Attribute für „Mass Assignment“ nutzen zu können, muss man explizit im Model mittels attr_accessible die einzelnen Attribute angeben.

Dazu folgendes Beispiel zum Verständnis:

class User < ActiveRecord::Base
    attr_accessible :name, :age    
end

class UsersController < ApplicationController
    def create
        # params = {:user => {:name => 'Hans', :age => 18}}
        @user = User.new(params[:user])
    end
end

Rails 4 require & permit

In Rails 4 ist dieses so nun nicht mehr möglich. Ansatt im Model die Attribute anzugeben, geschieht das nun im Controller mittels „Strong Parameters“ (siehe ActionController::Parameters). Diesbezüglich werden die Methoden require und permit bereitgestellt.

Auch hierzu ein einfaches Beispiel:

class User < ActiveRecord::Base   
end

class UsersController < ApplicationController
    def create
        # params = {:user => {:name => 'Hans', :age => 18}}
        @user = User.new(user_params)
    end

    def user_params
        params.require(:user).permit(:name, :age)
    end
end

Mittels require geben wir den gewünschten Schlüssel an und mit permit die entsprechenden Attribute.

Rails 4 permit und „Nested Attributes“

In meinem derzeitigen Projekt mache ich Gebrauch von „Nested Attributes“. Auch diese „Nested Attributes“ müsst ihr mittels permit explizit angeben, wenn ihr sie im Rahmen eines Mass Assignments nutzen bzw. zuweisen möchtet.

Im Folgenden ein einfaches Beispiel:

class Address < ActiveRecord::Base
end

class User < ActiveRecord::Base
    has_one :address
    accepts_nested_attributes_for :address   
end

class UsersController < ApplicationController
    def create
        # params = {
        #     :user => {
        #         :name => 'Hans', 
        #         :age => 18, 
        #         :address => {:street => 'Talweg 1', :zip => '17384'}
        #     }
        # }
        @user = User.new(user_params)
    end

    private
    def user_params
        params.require(:user).permit(
            :name, 
            :age, 
            :address => [:street, :zip]
        )
    end
end

Fazit

Wie mit allen liebt gewonnenen Features muss man sich an solche Änderungen, in diesem Fall bzgl. attr_accessible erst mal gewöhnen. Im Prinzip würde ich sagen, ist es aber aus Sicht der Verantwortlichkeiten von Model und Controller die richtige Entscheidung gewesen, die Angabe der „Mass Assignment“-Attrbute in den Controller zu verlagern.

Was haltet ihr von Ruby on Rails 4 und „Strong Parameters“?

Kommentare  
2 Kommentare vorhanden
1 Olli schrieb am 8. März 2014 um 12:48 Uhr

>Wie mit allen liebt gewonnenen Features muss man sich an solche Änderungen, in diesem Fall bzgl. attr_accessible erst mal gewöhnen.
Ja und jede Menge Code umstellen 🙁

2 Karsten Meier schrieb am 20. Januar 2016 um 20:52 Uhr

Im Prinzip halte ich das mit den strong_parameters für den richtigen Ansatz, das Überprüfen der Parameter halte ich für eine Aufgabe für den Controller und nicht für das Model. Beim Update einer alten Rail 3 Anwendung hat mich die nötige Arbeit dann auch abgeschreckt. Bei einer Neuentwicklung ist ja nicht so schlimm. Aber wenn man auf einen Schlag 60 Controller umschreiben soll, dann ist alleine das zusammensuchen der Felder eine großer Zeitfaktor.
Ich habe dann ein Script geschrieben, was zumindestens ein wenig die Arbeit erleichtert. Mehr in meinem verlinkten Blogeintrag.

0 Trackbacks/Pingbacks vorhanden
Du bist herzlich eingeladen auch ein Kommentar zu hinterlassen!
Kommentar schreiben

Vielen Dank für dein Kommentar!