获取ArgumentError错误的参数数量(0表示1)

时间:2011-12-05 19:40:18

标签: ruby-on-rails controller arguments

当我运行我的应用程序时,我收到以下错误:

ArgumentError in StatesController#filter

wrong number of arguments (0 for 1)

我的控制器看起来像这样:

class StatesController < ApplicationController
    def filter(my_string)

        @new_array = []
        @new_array = state.each {|x| if /#my_string/i =~ x then puts x end}
        return @new_array

    end

end

我的观点如下:

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>States</title>
  </head>

  <body>

        <% States.filter(params[:substring]) %>
        <p><%= @new_array.each %></p>
        <% if @new_array.size = 0 %>
        <p>No matches!</p>

    </body>

</html>

我的代码出了什么问题?

非常感谢

1 个答案:

答案 0 :(得分:3)

StatesController中的过滤方法是一个动作。此类操作不接受参数。实现您想要做的事情的更好方法是创建一个名为State的模型。并为其添加过滤方法:

# app/models/state.rb
class State
  def filter(params[:my_string])
    @new_array = []
    @new_array = state.each {|x| if /#my_string/i =~ x then puts x end}
    return @new_array
  end
end

在您的控制器中,您现在应该具有以下内容:

class StatesController < ApplicationController
  def filter
    @states = State.filter(params[:sub_string])
  end
end

然后在相应的视图中:

<% if @states.empty? %>
  <p>No matches!</p>
<% else %>
  <p>
    <% @states.each do |state| %>
      <%= state %>
    <% end %>
  </p>
<% end %>

这样做是使用模型将数组加载到实例变量中。可以在控制器操作中呈现的视图中访问此实例变量(以@开头)。我们正在使用的操作被指定为过滤器。

在视图中,我使用空格式检查数组中是否有任何结果?方法。否则我只是遍历数组。

现在,只有在标题中包含params [:sub_string]时才会有效。因此,您需要确保在网址中包含?sub_string=mystring之类的内容。

鉴于你的问题和你的代码布局,我认为你对rails很新。我真的建议你仔细阅读入门指南:http://guides.rubyonrails.org/getting_started.html