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