控制器,模型,视图。与传递参数混淆

时间:2017-02-03 14:51:38

标签: ruby-on-rails ruby

我的模型中定义了一个简单的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文档,但很难理解它。

我认为更大的情况是,在方法的形式中,正确的语法(或收集参数的方式)是什么?

2 个答案:

答案 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类。