面对有关rails中数组的问题

时间:2016-06-28 09:18:18

标签: ruby-on-rails arrays ruby postgresql

我正在rails中实现一个程序,其中有一个表单,在提交表单后,它将检查是否有任何记录具有数据库中特定字段的重复值。我的数据库表是学生。所以我对应的型号名称是Student。我正在我的控制器中编写这段代码(我刚才讨论过)。 但我面临以下错误。我正在使用一些数组进行内部操作。当我在ruby中编写特定函数(而不是rails)时,它工作正常。此外,由于使用"长度"

,我也面临错误

我的错误是: StudentsController中的NoMethodError #create

未定义的方法`[]'为零: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

3 个答案:

答案 0 :(得分:0)

  

我的错误是:StudentsController中的NoMethodError #create

     

未定义的方法`[]&#39;为零:NilClass

它只是意味着您尝试访问某些实际上是SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'SUM(IF(week_00 = ''', week_00, ''', QtySold, 0)) AS `', week_00, '`' ) ) INTO @sql FROM week_report1; SET @sql = CONCAT('SELECT Code, ', @sql, ' FROM week_report1 GROUP BY Code'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 对象的数组,而不是数组。

为了摆脱这个错误,你可以在Ruby中使用一种称为短路的技术。

让我们说你的下面一段代码产生了上述错误:

nil

您可以使用arr1[i] 这样的条件:

if

或者使用这样的短路技术:

if arr1
  arr1[i]
end

答案 1 :(得分:0)

如果您确定相关的代码段适用于ruby并且它不适用于rails,则问题很可能是由于内部和外部循环使用的变量i。无论如何,这需要先修复,否则只会导致意外行为。

外圈:

for i in 46..100

内圈:

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

i保留为外循环,并将内循环迭代器更改为j

希望它有助于:)

答案 2 :(得分:0)

添加@harish和@arslan的答案,可能会出现
temp2=Student.find_by(id:i)可能失败的情况,因为可能没有该ID的学生。
因此,temp2当时可能会返回零。

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

然后arr2.push将无效,因为table_val [i]为nil,因此nil类有可能存在未定义的方法[]。