我目前有一个用HAML编写的非常简单的搜索表单:
%form.search{ method: 'get', action: '/users/search' }
...在呈现此视图时,根据控制器在实例变量中设置的模型来呈现不同的搜索路线时,正确的rails约定是什么?
我找到了这个blog post,但是这个代码<%= form_tag(recipes_path, :method => "get"对我来说还不够通用。我希望根据控制器在呈现此视图时与之协作的模型来设置此值recipes_path。搜索表单可以跨多个具有自己的搜索操作的控制器使用。我的应用程序可以在不同的页面上搜索不同的型号。
我当然可以想出一种方法来做到这一点,但我想知道“正确”的方法,或者我认为是“rails”方法,即根据表单要搜索的数据,动态地将表单操作设置为不同的控制器操作。
发布于 2018-05-24 01:50:20
我不知道这样做的“正确”或“rails”方式是什么。(但是,它肯定不是用%form手工制作的表单。)
在我的应用程序中,我倾向于只有一个表单部分,如下所示:
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_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当然,还有更多的事情要做(比如,我如何将一个普通的老ruby对象转换成render)。但是,这应该会给你一种这样做的感觉。
发布于 2018-05-24 02:59:32
一种简单的方法,如果没有复杂的问题,并且您遵循约定,可以是这样的
%form.search{ method: 'get', action: "/#{controller_name}/search" }所以如果你在users_controller中,它将打印"users",如果你在static_pages_controller中,它将显示"static_pages“,依此类推。
https://stackoverflow.com/questions/50493597
复制相似问题