当我运行我的应用程序时,我收到以下错误:
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>
我的代码出了什么问题?
非常感谢
答案 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