2015-02-06 63 views
0

我收到以下錯誤,找不到用戶與 'ID'=如何讓用戶編輯他們在不同頁面上以紅寶石登錄的帳戶?

我有這個在我的Users_Controller

def edit 
    @user = @signed_in_user 
end 

這是我routes.rb

root 'welcome#welcome' 

    get 'login' => 'sessions#login', :as => :login 

    get 'profile' => 'users#profile', :as => :profile 

    post 'logging/user' => 'sessions#create' 

    get 'logout' => 'sessions#destroy', :as => :logout 

    get 'about' => 'about' 

    resources :users 

    get 'register' => 'users#new', :as => :register 

    get 'edit' => 'users#edit', :as => :edit 

這在我的application_controller.rb

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_action :set_user 
    protected 
    def set_user 
    unless session[:user_id] == nil 
     @signed_in_user = User.find(session[:user_id]) 
    end 
    end 
end 

這是我Users_Controller

這裏是我的User_Controller我的代碼上創建帳戶

class UsersController < ApplicationController 
    before_action :set_user, only: [:show, :edit, :update, :destroy] 


    # GET /users 
    # GET /users.json 
    def index 
    @users = User.all 
    end 
    def profile 
    @user = User.find(session[:user_id]) unless session[:user_id] == "" 
    redirect_to login_path, notice: "You're not logged in" unless @user 

    end 

    # GET /users/1 
    # GET /users/1.json 
    def show 
    end 

    # GET /users/new 
    def new 
    @user = User.new 
    end 

    # GET /users/1/edit 
    def edit 
    @user = @signed_in_user 

    end 

    # POST /users 
    # POST /users.json 
    def create 
    @user = User.new(user_params) 

    respond_to do |format| 
     if @user.save 
     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render :show, status: :created, location: @user } 
     else 
     format.html { render :new } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /users/1 
    # PATCH/PUT /users/1.json 
    def update 

    respond_to do |format| 
     if @user.update(user_params) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { render :show, status: :ok, location: @user } 
     else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /users/1 
    # DELETE /users/1.json 
    def destroy 
    @user.destroy 
    respond_to do |format| 
     format.html { redirect_to users_url, notice: 'User was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_user 
     @user = User.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def user_params 
     params.require(:user).permit(:name, :password, :password_confirmation, :email, :age) 
    end 
end 

這是我用我的HTML鏈接,

<li role="presentation"><%= link_to 'Edit', edit_path %></li> 
+0

檢查什麼樣的價值呢'會話[:USER_ID]'在應用控制器。 – Deep 2015-02-06 04:14:37

+0

我現在只想對此進行評論,我做了調試。我不確定我在找什麼。 – genobambino 2015-02-06 05:35:30

+0

我已經爲您發佈了一個解決問題的答案 – Deep 2015-02-06 06:10:30

回答

0
  1. 所以開始時,當您收到「無法找到」消息時,一個好習慣是檢查視圖中的實例變量。

因此,在視圖中,只需鍵入:<%= @user_id %>並查看是否有任何東西顯示在您的頁面上,從而指示是否有用戶甚至在場!另一個問題是您的實例變量可能是<%= user.id %>,但我不確定,因爲我看不到您的代碼以及用戶如何存儲在數據庫中。

  • 其次,如果你運行rake路線,你通常會發現編輯路徑將有一個URI模式,如:"/edit(.:format)",這意味着需要路由而"edit_path(@user.id)"不僅僅是"edit_path"
  • 讓我知道如果這導致你任何地方或你有進一步的問題,我希望我能回答他們!

    ===========

    附加信息:

    良好,沒有更多的代碼來看看,我將提供一些更多的建議......我們的目標是讓以某種方式在頁面上顯示<%= @user.id %>(或user_id),從而告訴您它是可用的。

    1. set_user方法是一個實例方法,而不是一個類方法。要使其成爲班級方法,請嘗試def self.set_user。這將調用控制器上實例的方法,從而使其成爲類方法。

    2. 確保你有一個會話對象使用。在路由中,它看起來像post post/user可能正在創建會話,但我不確定。

    3. 保留edit_path(@ user.id)或者爲用戶存儲id作爲路由,而不僅僅是edit_path。我敢肯定,如果你運行「耙路線」,它會告訴你一個額外的變量需要傳遞的鏈接工作

    +0

    好的,我沒有看到任何用戶標識符都提供了您給我的這些代碼。另外,我將修改添加到了我的edit_path中,但仍然是相同的錯誤。如果我可以從我的代碼發佈任何其他內容以幫助請讓我知道。 – genobambino 2015-02-06 04:26:54

    +0

    你有在用戶控制器中創建用戶的代碼嗎?所以當你創建一個用戶時,你實際上是在創建一個用戶並且有一個成功的重定向?另外,我會推薦使用像'設計'這樣的寶石。 Rails很棒,因爲人們爲你做了很多事情。 https://github.com/plataformatec/devise – snewcomer 2015-02-06 04:33:26

    +0

    你永遠不會得到'@ user_id',因爲沒有這樣定義的變量。它將始終提供空值。 – Deep 2015-02-06 04:33:32

    0

    使用寶石byebug這裏是鏈接:https://github.com/deivid-rodriguez/byebug。在編輯頁面中或在執行byebug操作時出現錯誤的位置出現此錯誤。正如你在控制檯中提到的那樣,它會在應用程序中顯示一個指向特定行的箭頭,最後一行應該顯示爲(byebug),在這裏寫出獲取用戶標識的變量。如果我們把你的應用程序控制器的例子在set_user方法:

    def set_user 
        byebug 
        unless session[:user_id] == nil 
         @signed_in_user = User.find(session[:user_id]) 
        end 
        end 
    

    在控制檯(byebug)session[:user_id]後,所以這會給你session[:user_id]的價值。所以,如果這是空的,那麼你在這裏有問題,或者只是按照相同的程序來檢查其他地方。

    另外還有一件事你可以學習只是創建一個新的項目或使用現有的項目,並生成一個腳手架,它會給你顯示,編輯,索引選項。它會生成所有的視圖,控制器代碼,遷移和一切。你可以這樣做:

    rails generate scaffold User email:string password:string 
    

    如果你願意,你可以添加更多的字段。然後在您的應用程序中訪問http://localhost:[port_no]/users,默認情況下,您將訪問索引頁,您可以在其中添加新用戶,編輯現有用戶。這會教你一切。這將像你的參考代碼。更多詳情,請登錄:http://guides.rubyonrails.org/command_line.html#rails-generate

    對於用戶來說更具體的只有一個名爲Devise的gem,它會爲用戶提供所有必需的東西,例如sign_in,sign_up和session_management。希望這些能幫助你解決你的問題。

    編輯:

    這裏是一個很好的教程鏈接,這將有助於您:https://www.railstutorial.org/book/updating_and_deleting_users#sec-updating_users

    +0

    我做了你說的話,在我的應用程序控制器中沒有問題,但是我在我的Users_controller中做了它,並且我只爲UserContr返回了「NameError異常:未定義的局部變量或方法'會話」oller: nil「 – genobambino 2015-02-06 06:20:17

    +0

    只是嘗試可能會幫助你的寶石或腳手架。還請用完整用戶控制器更新問題。因爲你應該在所有控制器中獲得會話。不知道你爲什麼沒有得到它。 – Deep 2015-02-06 06:22:18

    +0

    我更新了完整的User_controller問題 – genobambino 2015-02-06 06:34:53

    相關問題