/ rubeno

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.