2017-08-23 3 views
0

Wenn ich versuche, um einen Benutzer zu bearbeiten, erhalte ich die Fehlermeldung:Action :: ParameterMissing in Userscontroller # update Rails

Action :: ParameterMissing in Userscontroller # update param fehlt oder der Wert leer ist: Benutzer

mit der params.require Zeile markiert:

 def user_params 
      params.require(:user).permit(:name, :email, :role, :university_id, :password, :password_confirmation) 

    end 

ich bei ähnlichen Fragen nach Lösungen gesucht habe, aber kann nicht scheinen, um es zu bekommen zu arbeiten. Jede Hilfe für einen Anfänger würde sehr geschätzt werden!

Hier sind die Anfrage Parameter:

{"utf8"=>"✓", 
"_method"=>"patch", 
"authenticity_token"=>"PfLU2rMWnEMj4Nez+tNhsZz9v9z2jGmCTUXOOElmv9NMK6j8LTzvSuJGL9iH/cx02vb7Po3tSQIKmMXNPVhULg==", 
"staff"=>{"name"=>"fake alogo", "email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, 
"commit"=>"Save changes", 
"id"=>"103"} 

Hier ist die Form, ich bin mit den Benutzern bearbeiten:

<%= form_for(@user) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 

     <%= f.label :name %> 
     <%= f.text_field :name, class: 'form-control' %> 

     <%= f.label :email %> 
     <%= f.email_field :email, class: 'form-control' %> 

     <%= f.label :password %> 
     <%= f.password_field :password, class: 'form-control' %> 

     <%= f.label :password_confirmation, "Confirmation" %> 
     <%= f.password_field :password_confirmation, class: 'form-control' %> 

     <%= f.submit "Save changes", class: "btn btn-primary" %> 
    <% end %> 

Hier ist die Benutzer-Controller:

class UsersController < ApplicationController 
    before_action :logged_in_user, only: [:show, :index, :edit, :update, :destroy] 
    before_action :correct_user, only: [:edit, :update] 

    def index 
    @users = User.paginate(page: params[:page]) 
    end 

    def show 
    @user = User.find(params[:id]) 
    @referral_requests = @user.referral_requests.paginate(page: params[:page]) 
    end 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     @user.send_activation_email 
     flash[:info] = "Please check your email to activate your account." 
     redirect_to root_url 
    else 
     render 'new' 
    end 
    end 

    def edit 
    end 

    def update 
    if @user.update_attributes(user_params) 
     flash[:success] = "Profile updated" 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

def destroy 
    User.find(params[:id]).destroy 
    flash[:success] = "User deleted" 
    redirect_to users_url 
end 

    private 

     def user_params 
      params.require(:user).permit(:name, :email, :role, :university_id, :password, :password_confirmation) 

    end 

    # Before filters 


    # Confirms the correct user. 
    def correct_user 
     @user = User.find(params[:id]) 
     redirect_to(root_url) unless current_user?(@user) 
    end 
end 

Benutzer Modell:

class User < ApplicationRecord 
    self.inheritance_column = :role 
    enum role: { Staff: 0, Clinician: 1, Admin: 2 } 
    belongs_to :university 
    has_many :referral_requests 

    attr_accessor :remember_token, :activation_token, :reset_token 
    before_save :downcase_email 
    before_create :create_activation_digest 
    validates :name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 
    validates :email, presence: true, length: { maximum: 255 }, 
        format: { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 
    validates :role, presence: true 


    has_secure_password 
    validates :password, presence: true, length: { minimum: 6 }, allow_nil: true 

    # Returns the hash digest of the given string. 
    def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
                BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
    end 

    # Returns a random token. 
    def User.new_token 
    SecureRandom.urlsafe_base64 
    end 

    # Remembers a user in the database for use in persistent sessions. 
    def remember 
    self.remember_token = User.new_token 
    update_attribute(:remember_digest, User.digest(remember_token)) 
    end 

    # Returns true if the given token matches the digest. 
    def authenticated?(remember_token) 
     return false if remember_digest.nil? 
    BCrypt::Password.new(remember_digest).is_password?(remember_token) 
    end 


    # Forgets a user. 
    def forget 
    update_attribute(:remember_digest, nil) 
    end 

    # Returns true if the given token matches the digest. 
    def authenticated?(attribute, token) 
    digest = send("#{attribute}_digest") 
    return false if digest.nil? 
    BCrypt::Password.new(digest).is_password?(token) 
    end 

    # Activates an account. 
    def activate 
    update_attribute(:activated, true) 
    update_attribute(:activated_at, Time.zone.now) 
    end 

    # Sends activation email. 
    def send_activation_email 
    UserMailer.account_activation(self).deliver_now 
    end 

# Sets the password reset attributes. 
    def create_reset_digest 
    self.reset_token = User.new_token 
    update_attribute(:reset_digest, User.digest(reset_token)) 
    update_attribute(:reset_sent_at, Time.zone.now) 
    end 

    # Sends password reset email. 
    def send_password_reset_email 
    UserMailer.password_reset(self).deliver_now 
    end 

    # Returns true if a password reset has expired. 
    def password_reset_expired? 
    reset_sent_at < 2.hours.ago 
    end 

def feed 
    ReferralRequest.where("user_id = ?", id) 
    end 


private 

    # Converts email to all lower-case. 
    def downcase_email 
    self.email = email.downcase 
    end 

    # Creates and assigns the activation token and digest. 
    def create_activation_digest 
     self.activation_token = User.new_token 
     self.activation_digest = User.digest(activation_token) 
    end 


end 


class Staff < User 
    validates :university_id, presence: true 
end 

class Clinician < User 
    has_many :lists 
    has_many :universities, through: :lists 
end 

Antwort

3

den Beispielen nach, dass Sie zur Verfügung gestellt haben, anfordern params enthalten staff:

"staff"=>{"name"=>"fake alogo", ... 

enthalten jedoch keine user definiert starke params erfordern:

def user_params 
    params.require(:user).permit(:name, :email, :role, :university_id, :password, :password_confirmation) 
end 

Das ist, weil @user in form_for Methode ist eine Instanz der Staff Klasse. Und form_for nennt standardmäßig die Parameter als staff.

Glücklicherweise gibt es as Option für form_for zur Konfiguration von:

<%= form_for(@user, as: :user) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 

    <%= f.label :name %> 
    <%= f.text_field :name, class: 'form-control' %> 

    <%= f.label :email %> 
    <%= f.email_field :email, class: 'form-control' %> 

    <%= f.label :password %> 
    <%= f.password_field :password, class: 'form-control' %> 

    <%= f.label :password_confirmation, "Confirmation" %> 
    <%= f.password_field :password_confirmation, class: 'form-control' %> 

    <%= f.submit "Save changes", class: "btn btn-primary" %> 
<% end %> 

Es sollte die params als "user" => {"name" => ...}

+0

Das funktioniert senden! Danke Igor! – mike9182

Verwandte Themen