2017-01-04 10 views
0

Ich habe einen Fehler, dassNoMethodError nicht definierte Methode

NoMethodError in Homecontroller # index nicht definierte Methode `id‘ für nil: NilClass.

@id = params[:id] 
@email = [:email] 
if @id == @user.id && @email == @user.email 
    render :text => "sucsess" 
else 
    render :text => "fail" 

Fehlermeldung hat mir gesagt, diese Codes waren strange.It sagt undefined method 'id', so ist @id von wenn @id == @user.id Methode scheinen? (Ich glaube, ich definieren @id Variable)

Was soll ich beheben tun es?

home_controller

class HomeController < ApplicationController 
    def index 
    @id = params[:id] 
    @email = [:email] 
    if @id == @user.id && @email == @user.email 
     render :text => "成功" 
    else 
     render :text => "失敗" 
    end 
    end 

    def create 
    userData = UserData.new(create_params) 
    user = User.find(params[:id]).to_json 

    # エラー処理 
    unless userData.save 
     @error_message = [memo.errors.full_messages].compact 
    end 
    end 
end 

routes.rb

Rails.application.routes.draw do 
    devise_for :users 
    root to: "home#index" 
    get 'home/index' 
    post 'home/index' 

    namespace :home, default: {format: :json} do 
    resources :index, only: :create 
    end 
end 

Antwort

0

Sie haben keinen Wert für @user, das, warum es undefinierte Methode id sagt. Sie müssen Wert haben für sie mag:

@user = User.find(params[:id]) 

oder

@user = User.first 

Auf Code:

def index 
    @user = User.first # defined User here like code on this line I added 
    @id = params[:id] 
    @email = [:email] 
    if @id == @user.id && @email == @user.email 
    render :text => "成功" 
    else 
    render :text => "失敗" 
    end 
end 

sollten Sie sicherstellen, dass Sie es definiert. Wenn Sie before_filter :your_method_define_user, only: [:index] haben, stellen Sie sicher, dass :your_method_define_user einen Wert für @user hat.

Als @ Deepak Mahakale oben geschrieben. Ich schätze du bist verwirrt. Versuchen Sie den vollständigen Code:

AKTUALISIERT:

Ihre Routen:

Rails.application.routes.draw do 
    devise_for :users 
    get 'home/index' # you must decide what to use post or get. But I use get here as default how index method is implemented in rails. 
    root to: "home#index" 
end 

Ihr Controller:

class HomeController < ApplicationController 
    before_filter :find_user, only: [:index] 

    def index 
    @id = params[:id] 
    @email = [:email] 
    if @id == @user.id && @email == @user.email 
     render :text => "成功" 
    else 
     render :text => "失敗" 
    end 
    end 

    def create 
    userData = UserData.new(create_params) 
    user = User.find(params[:id]).to_json 

    # エラー処理 
    unless userData.save 
     @error_message = [memo.errors.full_messages].compact 
    end 
    end 



    private 

    def find_user 
     @user = User.find(params[:id]) # You should specify this code what are your comparing to. 
    end 
end 

hinzufügen sollten die Parameter in URL übergeben, wenn Sie Anfrage bekommen verwenden , wie:

und geben Sie diese auf den Feldern in Ihrem Formular weiter.

+0

thx, ur Kommentar hinzufügen. Ich schrieb meinen Code wie Ihr, aber ich habe Fehler wie ActiveRecord :: RecordNotFound in HomeController # index Konnte nicht Benutzer mit 'ID' = – Rose2017

+0

@ Rose2017, zusätzliche, warum verwenden Sie 2 Anfrage mit der gleichen Methode ' Startseite # index'? Was ist dein Ziel damit? – araratan

+0

Ich möchte einen Server, dass App-Benutzer können sich anmelden und abmelden, aber ich bin ein Anfänger, so dass ich nicht weiß, warum mu-code sind falsch.u sagte mir, dass ich mit der gleichen Methode home # index, die Teile sind 2 Anfragen? Ich dachte mein Code hätte nur wenn-sonst-Methode. – Rose2017

1

NoMethodError in HomeController # index undefinierte Methode `id 'für nil: NilClass.

@user ist nil in Index Aktion

Sie müssen festlegen das @user erste in Index Aktion oder in before_filter

Lösung 1

def index 
    @id = params[:id] 
    @email = [:email] 
    @user = User.find(params[:id]) # or current_user whatever your logic is 
    if @id == @user.id && @email == @user.email 
    render :text => "成功" 
    else 
    render :text => "失敗" 
    end 
end 

Lösung 2

eine before_filter für index Aktion

before_filter :find_user, only: [:index] 

private 

def find_user 
    @user = User.find(params[:id]) # or current_user implement this according to your logic 
end 
+0

Ändern Sie '@user = current_user' in' @user = find_user', damit er nicht verwechseln kann. – araratan

+0

In der ersten Lösung rufe ich nicht die private Methode auf, sondern 'current_user' Helfer, der Ihnen den aktuell angemeldeten Benutzer gibt. Sein von Gerät –

+0

Ich änderte es in' User.find (id) ' –

Verwandte Themen