我的模型中定义了一个简单的self
方法。
def self.search(name, type)
#handle name
#handle type
end
我对这个观点的看法很困惑。控制器。传递正确的值(或使用正确的语法)。
在视图中,一个简单的表单。
<%= form_tag(index_path, method: :get) do %>
<%= label_tag :type, 'Type' %>
<% type_array = ["Foo", "Foo_One", "Foo_Two", "Foo_Three"] %>
<%= select_tag :type, options_for_select(type_array, selected: params[:type]), include_blank: true %>
<%= label_tag :name, 'Name' %>
<% name_array = ["Foo", "Foo_One", "Foo_Two", "Foo_Three"] %>
<%= select_tag :name, options_for_select(name_array, selected: params[:name]), include_blank: true %>
<%= submit_tag "Filter" %>
<% end %>
困惑一个
在options_for_select
下,是select_tag :search
还是select_tag :type
?它应该是selected: params[:search]
而不是
在控制器中
def index
@foo = Foo.all
#variation 1 that i tried
@foo = @foo.search(params[:search]) if search(params[:search]).present?
#variation 2 that i tried
@foo = @foo.search(params[:name,:type]) if search(params[:name,:type]).present?
#variation 3 that i tried
@foo = @foo.search(params[:name][:type]) if search(params[:name][:type]).present?
end
困惑二
变化3种对我来说最有意义。但我没有看到self.search
被召唤。它也会抛出一个错误(没有将Symbol隐式转换为整数)。
我不确定错误是否与我的表格有关?
显然,我不太熟悉知道在哪里通过参数并“收集”它们。我试过阅读ruby文档,但很难理解它。
我认为更大的情况是,在方法的形式中,正确的语法(或收集参数的方式)是什么?
答案 0 :(得分:0)
困惑1:在你的情况下调用select_tags是什么并不重要,因为你似乎没有把它绑在一个实际的模型属性上,但是'name'和'type'很简单,因为它有输入字段上的HTML属性名称和类型。尽管如此,它仍然会按照您的方式工作,并且“选定”选项看起来很好。
困惑2:你需要从params hash中单独访问它们:
@foo.search(params[:name], params[:type]) if params[:name].present? || params[:type].present?
但是,您已将其定义为自我方法:
class FooClass
def self.search(name, type)
# blah
end
这意味着您无法在类的实例上访问它,即@ foo.search,您可以从类本身调用它:
FooClass.search(params[:name], params[:type]) if params[:name].present? || params[:type].present?
如果另一方面你没有“自我”,那么:
class FooClass
def search(name, type)
# blah
end
你能做到:
@foo = FooClass.new
@my_var = @foo.search(params[:name], params[:type])
答案 1 :(得分:0)
首先将更改self.search
改为search
,因为您控制器中的index
方法正在使用Foo
模型的实例。当你做self.method
这是一个类级别的方法,并且基本上无需创建你的类的实例,在这种情况下是你的Foo类。