StrongParameters en Rails
Enmetita en Rails 4 estis novan projekton nomitan StrongParameters (fortaj parametroj). Ĝi celas protekti parametrojn de la HTTP tavolo esti enmetita en modelon. Kiel ekzemplo, ni diru ke vi havas la sekvan formularon:
<%= form_for @uzanto, url: {action: "create"}, html: do |uzanto| %>
<%= uzanto.text_field :nomo %>
<%= uzanto.submit "Create" %>
<% end %>
kun la Model
class Uzanto < ActiveRecord::Base
attr_accessible :nomo, :administranto
end
kaj la metodo en la Controller
class UsersController < ActionController::Base
def create
uzanto = Uzanto.create(params[:uzanto])
uzanto.save!
end
end
La problemo estas ke la formularo enhavas nur nomo, sed la uzanto povas sendi kaj la noman kaj la administrantan kampojn, kiu verŝajne estas sekureraro. Tie estas kie StrongParameters povas helpi. Kun StrongParameters vi povas specifi kiujn kampojn estas permesataj. En ĉi tiu ekzemplo vi povas havi
class UsersController < ActionController::Base
def create
uzanto = Uzanto.create(uzantparametroj)
uzanto.save!
end
private
def uzantparametroj
params.require(:uzanto).permit(:nomo)
end
end
Tiel vi postulas (require) ke uzanto
estas en la parametroj kaj vi permesas (permit) ke nomo
estas permesata sub la uzanto
.
Vi povas uzi ian logikon vi volas, ekzemple en la Controller
por administranto, eble estas permesata aŭ vi povas uzi la saman Controller
<%= form_for @uzanto, url: {action: "create"}, html: do |uzanto| %>
<%= uzanto.text_field :nomo %>
<% if aktuala_uzanto.administranto? %>
<%= uzanto.check_box :administranto %>
<% end %>
<%= uzanto.submit "Create" %>
<% end %>
class UsersController < ActionController::Base
def create
uzanto = Uzanto.create(uzantparametroj)
uzanto.save!
end
private
def uzantparametroj
novaj_parametroj = params.require(:uzanto).permit(:nomo)
novaj_parametroj.require(:uzanto).permit(:administranto) if aktuala_uzanto.administranto?
end
end
Se vi volas ludi kun StrongParameters vi povas uzi ĝin rekte
parametroj = { :uzanto => { :nomo => "Zam", :administranto => true } }
novaj_parametroj = ActionController::Parameters.new(parametroj)
novaj_parametroj.require(:uzanto).permit(:nomo)
#=> Unpermitted parameter: administranto
#=> {"nomo"=>"Zam"}
Se vi pasas la kontrolitajn parametrojn al .create
kaj la parametroj enhavas ion malpermisitan, Rails ĵetos ActiveModel::ForbiddenAttributesError
Metodoj kiuj uzas StrongParameters estas:
- ActionRecord::Base.new
- ActionRecord::Base.create
- ActionRecord::Base.update_attributes
- ActionRecord::Base.?ingita_kampo?_attributes=
StrongParameters povas helpi kontraŭ sekureraroj kaj mi tute rekomendus la uzandon.