Ruby on rails 如何在Rails视图中动态设置具有不同路由的搜索表单?

Ruby on rails 如何在Rails视图中动态设置具有不同路由的搜索表单?,ruby-on-rails,Ruby On Rails,我目前有一个用HAML编写的非常简单的搜索表单: %form.search{ method: 'get', action: '/users/search' } ... 在呈现此视图时,基于控制器在实例变量中设置的模型,呈现不同搜索路径的正确rails约定是什么 我找到了这个,但是这个代码“get”对我来说不够通用。我想根据控制器渲染此视图时与之协作的模型设置此值,recipes\u path。搜索表单可以通过多个控制器自己的搜索操作跨多个控制器使用。我的应用程序可以在不同的页面上搜索不同的型号

我目前有一个用HAML编写的非常简单的搜索表单:

%form.search{ method: 'get', action: '/users/search' }
...
在呈现此视图时,基于控制器在实例变量中设置的模型,呈现不同搜索路径的正确rails约定是什么

我找到了这个,但是这个代码
“get”
对我来说不够通用。我想根据控制器渲染此视图时与之协作的模型设置此值,
recipes\u path
。搜索表单可以通过多个控制器自己的搜索操作跨多个控制器使用。我的应用程序可以在不同的页面上搜索不同的型号


我肯定能想出一种方法来做这件事,但我想知道“正确”的方法,或者我认为是“rails”的方法,根据表单将要搜索的数据动态地将表单操作设置为不同的控制器操作。

我不知道这样做的“正确”或“rails”方法是什么。(但是,它肯定不是用
%form
手工制作表单)

在我的应用程序中,我倾向于只有一个类似以下内容的表单部分:

class PresenterBase

  def render_partial
    render(partial: "#{file_name}", locals: {presenter: self})
  end

  def render_form
    render_partial 'widgets/form'
  end

end
app/views/widgets/form

- @presenter = local_assigns[:presenter] if local_assigns[:presenter]

= form_tag @presenter.form_path, remote: true, id: @presenter.form_id, class: @presenter.form_classes, data: @presenter.form_data, method: @presenter.form_method do 
    = @presenter.form_inner
在我的
presenter\u base.rb文件中,我有如下内容:

class PresenterBase

  def render_partial
    render(partial: "#{file_name}", locals: {presenter: self})
  end

  def render_form
    render_partial 'widgets/form'
  end

end
因此,要在
FooPresenter
中呈现表单,我可以执行以下操作:

class FooPresenter < PresenterBase

  def present
    render_form
  end

  def form_path
    some_form_path(and: :maybe, some: :query_params)
  end

  def form_id
    'my-cool-form'
  end

  def form_classes
    'some cool classes'
  end

  def form_data
    {some: :form, data: :here}
  end

  def form_method
    :post
  end

  def form_inner
    ...
  end

end
class FooPresenter

当然,这不仅仅是一个问题(比如,如何让一个普通的ruby对象
渲染
)。但是,这应该给你一种方法的感觉。

我不知道什么是“正确”或“rails”的方法。(但是,它肯定不是用
%form
手工制作表单)

在我的应用程序中,我倾向于只有一个类似以下内容的表单部分:

class PresenterBase

  def render_partial
    render(partial: "#{file_name}", locals: {presenter: self})
  end

  def render_form
    render_partial 'widgets/form'
  end

end
app/views/widgets/form

- @presenter = local_assigns[:presenter] if local_assigns[:presenter]

= form_tag @presenter.form_path, remote: true, id: @presenter.form_id, class: @presenter.form_classes, data: @presenter.form_data, method: @presenter.form_method do 
    = @presenter.form_inner
在我的
presenter\u base.rb文件中,我有如下内容:

class PresenterBase

  def render_partial
    render(partial: "#{file_name}", locals: {presenter: self})
  end

  def render_form
    render_partial 'widgets/form'
  end

end
因此,要在
FooPresenter
中呈现表单,我可以执行以下操作:

class FooPresenter < PresenterBase

  def present
    render_form
  end

  def form_path
    some_form_path(and: :maybe, some: :query_params)
  end

  def form_id
    'my-cool-form'
  end

  def form_classes
    'some cool classes'
  end

  def form_data
    {some: :form, data: :here}
  end

  def form_method
    :post
  end

  def form_inner
    ...
  end

end
class FooPresenter

当然,这不仅仅是一个问题(比如,如何让一个普通的ruby对象
渲染
)。但是,这应该给你一种做这件事的方法。

一种简单的方法,如果没有复杂问题,并且你遵循惯例,可以是这样的

%form.search{ method: 'get', action: "/#{controller_name}/search" }

因此,如果您在users\u controller中,它将打印“users”,如果您在static\u pages\u controller中,它将显示“static\u pages”等等。

一种简单的方法,如果没有复杂问题,并且您遵循惯例,可以是这样的

%form.search{ method: 'get', action: "/#{controller_name}/search" }
所以,如果您在users\u controller中,它将打印“users”,如果您在static\u pages\u controller中,它将显示“static\u pages”等等