【问题标题】:facing issues about array in rails面临有关rails中阵列的问题
【发布时间】:2016-06-28 09:18:17
【问题描述】:

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

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

nil: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

【问题讨论】:

  • 向我展示您的路线和查看文件,并执行 puts "#{ @student.to_json}"
  • 你能分享一下你在哪一行得到undefined method []' for nil:NilClass` 错误的详细信息吗?
  • 与您的问题无关,但考虑使用 Array#Include?而不是长 OR。例如if ["@", "#", "{" , ... etc].include?(arr1[i])
  • 另外,不要使用for,它非常不符合Ruby。请改用map 或each。

标签: ruby-on-rails arrays ruby postgresql


【解决方案1】:

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

nil:NilClass 的未定义方法 `[]'

这只是意味着您试图以数组的形式访问某些东西,该数组实际上是nil 对象,而不是数组。

要消除此错误,您可以使用 Ruby 中称为短路的技术。

假设您的以下代码产生了上述错误:

arr1[i]

您可以像这样使用if 条件:

if arr1
  arr1[i]
end

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

arr1 && arr1[i]

【讨论】:

  • 你还面临同样的错误吗?而且您在使用数组的任何地方都应用了&amp;&amp;,并且您不确定该数组是否可以是nil 对象。
  • 我使用了第一个 if 方法...因为我使用另一个 if 和多个 OR 语句,那么如何在那里使用 && 选项?..请详细说明
【解决方案2】:

如果您确定相关代码 sn-p 适用于 ruby​​ 而不适用于 rails,则问题很可能是由于在内部和外部循环中都使用了变量 i。在任何情况下,都需要先解决此问题,否则只会导致意外行为。

外循环:

for i in 46..100

内循环:

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

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

希望对你有帮助:)

【讨论】:

  • 您已经更改了所有相关的i 和j 的权利,但仍然没有工作?好吧,这可能不是唯一的问题。但如果不解决这个问题,它肯定会继续导致意外行为。
  • 是的,当然...感谢您引起我的注意。很遗憾,我错过了。
【解决方案3】:

除了@harish 和@arslan 的答案之外,可能存在以下情况:
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] 为 nil,因此 nil 类有未定义方法 [] 的机会。

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多