Как я могу динамически установить форму поиска с другим маршрутом в представлениях Rails? - PullRequest
0 голосов
/ 23 мая 2018

В настоящее время у меня есть очень простая форма для поиска, написанная на HAML:

%form.search{ method: 'get', action: '/users/search' }
...

Каковы будут правильные соглашения по рельсам для рендеринга другого маршрута поиска на основе модели, которую контроллер устанавливает в переменной экземплярапри отображении этого представления?

Я нашел это сообщение в блоге , но этот код <%= form_tag(recipes_path, :method => "get" не достаточно универсален для меня.Я хотел бы установить это значение recipes_path, основываясь на модели, с которой взаимодействует контроллер, когда он отображает это представление.Форма поиска может использоваться для нескольких контроллеров с их собственным действием поиска.Мое приложение может искать на разных страницах разные модели.

Я определенно могу придумать, как это сделать, но я бы хотел знать «правильный» путь или я предполагаю, что «рельсовый» путь динамическиустановка действия формы для другого действия контроллера на основе данных, по которым форма будет искать.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Простой способ, если нет никаких сложностей, и вы следуете соглашениям, может быть что-то вроде этого

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

, поэтому, если вы находитесь в users_controller, он напечатает «users», если вы находитесь в static_pages_controller, он покажет "static_pages" и т. д.

0 голосов
/ 23 мая 2018

Я не знаю, что такое «правильный» или «рельсовый» способ сделать это.(Но, конечно, это не ручная обработка формы с %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).Но это должно дать вам ощущение одного способа сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...