2016-06-28 24 views
0

我實現在軌一個程序,其中有一個表單並提交表單後,它會檢查是否有與數據庫中的特定字段重複值的任何記錄陣列面臨的問題。我的數據庫表是學生。所以我相應的型號名稱是學生。我在我的控制器中編寫了這個代碼(我剛剛討論過)。 但我面臨以下錯誤。我正在使用一些數組進行內部操作。當我僅在Ruby中寫入特定函數(不是rails)時,它工作正常。此外,由於使用「長度」,我也面臨錯誤。有關在軌

我的錯誤是: NoMethodError在StudentsController#創建

未定義的方法`[]」爲零:NilClass

我的控制器的代碼:

class StudentsController < ApplicationController 

def new 
    @student=Student.new 
    @students=Student.all 
end 

def create 
    @student=Student.new(u_params) 
    ret_val=string_check 
    if ret_val==1 
     @student.save 
     redirect_to new_student_path , :notice => "Inserted!!!" 

    else 
     redirect_to new_student_path , :notice => "Match,Not inserted!!!" 
    end 
end 


def u_params 
    params.require(:student).permit(:id ,:firstname, :lastname) 
end 

def u_params_second 
    params.require(:student).permit(:firstname) 
end 

def string_check 
    count =0; 
    #temp1=:firstname 
    temp1=params[:firstname] 
    supplied_val=temp1 

    puts "Entered in string_check method" 
    for i in 46..100 


     temp2=Student.find_by(id:i) 
     table_val=temp2.firstname 


     size1=supplied_val.to_s.length 
     size2=table_val.to_s.length 

     arr1=Array.new 
     arr2=Array.new 

     # arr1[i] ||= [] 
     # arr2[i] ||= [] 

     for i in 0..size1 

      arr1.push(supplied_val[i]) 
     end 

     for i in 0..size2 

      arr2.push(table_val[i]) 
     end 


     for i in 0..size1 
      if arr1[i]=="@" || arr1[i]=="#" || arr1[i]=="{" || arr1[i]=="}" || arr1[i]=="(" || arr1[i]==")" || arr1[i]=="[" || arr1[i]=="]" || arr1[i]=="." || arr1[i]==";" || arr1[i]=="," || arr1[i]=="%" || arr1[i]=="&" || arr1[i]=="*" || arr1[i]=="!" || arr1[i]=="?" || arr1[i]=="$" || arr1[i]=="^" || arr1[i]==":" || arr1[i]=="-" || arr1[i]=="/" 
       count=count+1 
       # puts count 
       arr1[i]="" 
      end 
     end 
     # puts arr1 
     puts arr1.join 
     final1=arr1.join 



     for i in 0..size2 
      if arr2[i]=="@" || arr2[i]=="#" || arr2[i]=="{" || arr2[i]=="}" || arr2[i]=="(" || arr2[i]==")" || arr2[i]=="[" || arr2[i]=="]" || arr2[i]=="." || arr2[i]==";" || arr2[i]=="," || arr2[i]=="%" || arr2[i]=="&" || arr2[i]=="*" || arr2[i]=="!" || arr2[i]=="?" || arr2[i]=="$" || arr2[i]=="^" || arr2[i]==":" || arr2[i]=="-" || arr2[i]=="/" 
       count=count+1 
       # puts count 
       arr2[i]="" 
      end 
     end 
     # puts arr2 
     puts arr2.join 
     final2=arr2.join 

     if final1==final2 
      flag=0 
     else 
      flag=1 
     end 
     return flag 
    end 

    end 
end 

的routes.rb中文件:

Rails.application.routes.draw do 

    resources :students 
end 
+0

讓我看看你的路線和視圖文件,並做「#{@ student.to_json}」 –

+0

你可以分享你在哪一行得到'nil:NilClass'錯誤的未定義方法'[]'的細節? –

+0

與您的問題無關,但請考慮使用Array#Include?而不是長期的ORs。例如'if [「@」,「#」,「{」,... etc] .include?(arr1 [i])' – Nimir

回答

0

My error is: NoMethodError in StudentsController#create

undefined method `[]' for nil:NilClass

它只是意味着你試圖訪問的東西作爲一個數組,實際上是一個nil對象,而不是一個數組。

爲了擺脫這種錯誤的,你可以在技術稱爲短路紅寶石。

比方說,你下面的代碼段是生產上述錯誤:

arr1[i] 

您可以使用if情況是這樣的:

if arr1 
    arr1[i] 
end 

或者使用這樣的短路的技術:

arr1 && arr1[i] 
+0

什麼都沒有發生 – Abhradip

+0

你還面臨同樣的錯誤嗎?而且,在你使用數組的地方你已經應用了'&&',並且你不確定這個數組可能是一個'nil'對象。 –

+0

我已經使用第一個如果方法...因爲我使用另一個如果有多個OR語句,那麼如何使用&&選項那裏?..請詳細 – Abhradip

0

如果確定相關的代碼片段被幹活對於紅寶石而言,它不適用於導軌,問題很可能是由於內部和外部循環都使用了變量i。無論如何,這需要先解決,否則只會導致意外行爲。

外環:

for i in 46..100 

內環:

for i in 0..size1 
for i in 0..size2 
... 

保持i爲外環和改變內循環迭代j

希望它有助於:)

+0

沒有什麼是發生,,,我也試過這 – Abhradip

+0

你已經改變所有相關的'我'和'J'是正確的,仍然沒有工作?那麼,這可能不是唯一的問題。但是,如果這不是固定的,那肯定會造成意想不到的行爲。 –

+1

是啊當然...謝謝你把我的注意力放在那裏。我很遺憾地錯過了它。 – Abhradip

0

添加@harish和@arslan的答案,th ERE可能是在那裏,
temp2=Student.find_by(id:i)可能會失敗,因爲有可能與該ID的學生的情況。
所以,TEMP2可能在那個時候返回nil。

for i in 0..size2 
    arr2.push(table_val[i]) // this may get failed 
end 

然後arr2.push不會工作,因爲table_val [i]是零,所以有對於零類未定義的方法[]的機會。