Ich bin relativ neu zu Schienen (und Codierung) und mein Verständnis ist nicht 100% auf diesem, ich habe versucht, starke params Dokumentation auf Anforderung lesen, und bin nicht in der Lage, das Problem zu lösen.Ist das eine unsichere Art, starke Params für Schienen zu verwenden?
Ich habe Benutzer und Administratoren mit Pundit für eine Website erstellt. Ich habe ein Dashboard erstellt, auf das nur Administratoren zugreifen können. Es bietet einen Überblick über alle Benutzer, eine Möglichkeit, sie zu löschen, und eine Möglichkeit, ihre Rolle zu ändern. Soweit ich weiß, verwendet dies die update-Methode users_controller, die in user_params übergeben wird.
Die Benutzer-Update-Methode ist auch, aus dem, was ich verstehe, für Benutzer verwendet, um ihr eigenes Profil zu bearbeiten (E-Mail ändern, etc.) und ich bin besorgt, dass ich eine Möglichkeit für sie eine Rollenänderung übergeben haben durch die Form irgendwie.
Ist dies der richtige Weg? Oder sollte ich einen neuen Satz von Parametern für den Rollenwechsel erstellen, die ausschließlich auf der Benutzer-Dashboard-Seite verwendet werden - wenn ja, wie würde ich dies tun?
Ich fühle mich wie ich vermisse, oder ein paar Dinge hier.
user_controller.rb: Klasse Userscontroller < Application
before_filter :authenticate_user!
after_action :verify_authorized
before_action :set_user, only: [:edit, :update, :show, :destroy]
def update
if @user.update(user_params)
authorize @user
flash[:success] = "Profile updated successfully!"
redirect_to @user
else
render 'edit'
end
end
def create
@user = User.new(user_params)
if @user.save
session[:user_id] = @user.id
cookies.signed[:user_id] = @user.id
flash[:success] = "Welcome #{@user.username} to Day One"
redirect_to user_path(@user)
else
render 'new'
end
end
def show
authorize @user
end
def destroy
authorize @user
@user.destroy
flash[:danger] = "User and all their related goals have been deleted"
redirect_to users_path
end
def user_dashboard
@users = User.all
authorize User
end
private
def user_params
params.require(:user).permit(:username, :email, :password, :password_confirmation, :profileimage, :role)
end
def set_user
@user = User.find(params[:id])
end
end
Dashboardseite:
<% @users.each do |user| %>
<tr>
<td>
<%= link_to user.email, user %>
</td>
<td>
<%= form_for(user) do |f| %>
<%= f.select(:role, User.roles.keys.map {|role| [role.titleize,role]}) %>
<td>
<button><%= f.submit 'Change Role' %></button>
</td>
<% end %>
und schließlich user_policy.rb:
class UserPolicy < ApplicationPolicy
attr_reader :current_user, :model
def initialize(current_user, model)
@current_user = current_user
@user = model
end
def index?
@current_user.admin?
end
def show?
# scope.where(:id => record.id).exists?
end
def create?
false
end
def new?
create?
end
def update?
@current_user.admin? || @current_user == @user
end
def edit?
@current_user.admin? || @current_user == @user
end
def destroy?
@current_user.admin?
end
def user_dashboard?
@current_user.admin?
end
end
Warum autorisieren Sie Benutzer __after__ Sie das Update durchgeführt? –