【问题标题】:Using an object in a different controller in rails在rails的不同控制器中使用对象
【发布时间】:2013-02-07 21:37:23
【问题描述】:

我正在使用 Rails 3、mac os 山狮和 Ruby 1.9.3

所以我有一个名为 object1 的对象。我为它构建了一个搜索功能,它可以正常工作:

def self.search(search)
  search_condition = "%" + search + "%"
  if search
    find(:all, :conditions => ['name LIKE ?', search_condition])
  else
    find(:all)
  end
end

现在我想在 object2 中使用它。所以在 object2 控制器中我写道:

def search
  @results = Object1.search(params[:search])
end

在视图中:

= form_tag object2_path, :method => 'get' do
  #{text_field_tag :search, params[:search], :id => 'search_field'}
  #{submit_tag "Search", :name => nil}

- for result in @results
  %li
    = result.name

但由于某种原因,@results 返回 nil。我在做什么有什么问题?非常感谢。

【问题讨论】:

  • scope :search, ->(name) { where("name LIKE ?", name) }
  • @results 在搜索动作中声明,这是处理请求的动作吗?如果您的视图在处理搜索操作后未呈现,您将在视图中使用 @results 变量。

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

您进行搜索的代码是正确的,这不是问题所在。在您看来,您写道:

= form_tag object2_path, :method => 'get' do

除非您采取特殊措施,否则这将影响您的 object2-controller 的 index 方法。因此,您可以通过更改索引方法来搜索是否定义了 params[:search] 来解决此问题。

或者更改表单的路径以转到搜索路径并确保它呈现正确的视图。

HTH。

【讨论】:

    【解决方案2】:

    您确定在 routes.rb 中定义了搜索方法吗? 如果您不这样做,它将默认为显示操作,并且可能未设置 @search。

    您可能还想更改表单的 URL:

    form_tag object2_path, :method => 'get' do
    

    form_tag search_object2_path, :method => 'get' do
    

    您的控制器代码在我看来很好。

    【讨论】:

      【解决方案3】:

      始终将通用代码放在应用程序助手中;

      应用助手:

      module ApplicationHelper
        def search(search)
          search_condition = "%" + search + "%"
            if search
              find(:all, :conditions => ['name LIKE ?', search_condition])
            else
              find(:all)
            end
        end
      end
      

      现在您可以从控制器中调用该方法,例如:

      search(params[:search])
      

      如果您想确定如何从控制器调用辅助方法,请查看this SO 帖子。

      【讨论】:

      • 帮助程序用于查看代码。这属于模型。资料来源:几乎所有关于 Rails 助手的文章。
      • 这实际上是属于控制器的。我已经根据问题更新了。您不能说它们仅用于视图。
      • 我同意 Fareesh。鉴于这个特定的功能,我说这属于模型而不是助手。助手应该使用视图而不是连接到数据库。
      • @jvnill- 与仅问题相比,我通过在控制器中调用方法来更新帖子,因为提问者从那里调用。否则在此之前,我将其保存在模型中。
      • Aaarrrgghh 这是有史以来最糟糕的建议。 ApplicationHelper 用于查看助手。在这种情况下,search 方法已经定义在它所属的位置:在模型上。为什么建议将其移至助手?不起作用!方法find 未在帮助程序上下文中定义。它仅适用于 ActiveRecord 模型。
      猜你喜欢
      • 2015-07-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      相关资源
      最近更新 更多