Rails 6 - значения из поля зрения не доходят до контроллера - PullRequest
0 голосов
/ 25 мая 2020

=> Rails 6.0.3

Даты не передаются из представления / формы в контроллер.

Что работает

  1. В представлении поля даты предварительно заполнены значениями по умолчанию из / models / case_search.rb - def initialize (params)

  2. Список кейсов извлекается из БД

    SELECT "cases".*
    FROM "cases"
    WHERE (closed_date BETWEEN '2020-05-23' AND '2020-05-25')
    

Что не удается

  1. Когда я меняю даты в полях формы, URL-адрес меняется на:

    http://localhost: 3000 / team / 5? Date + from = 2020-05-10 & Date + to = 2020-05-15 & commit = List

    Но список кейсов остается неизменным:

    SELECT "cases".*
    FROM "cases"
    WHERE (closed_date BETWEEN '2020-05-23' AND '2020-05-25')
    

Каким-то образом переменная @search достигает контроллера пустой, и по умолчанию она всегда принимает значения, установленные в / models / case_search.rb - def initialize (params) - def parsed_date ( date_string, по умолчанию) .

Может ли кто-нибудь определить причину проблемы?

У меня есть следующая форма в /teams/show.html.erb:

<%= form_tag team_path, method: "get" do %>
    <%= text_field_tag 'Date from', @search.date_from %>
    <%= text_field_tag 'Date to', @search.date_to %>
    <%= submit_tag 'List', class: 'btn btn-dark' %>
<% end %>

Файл контроллера teams_controller.rb имеет:

def show
    @team = Team.find(params[:id])
    @team_owner = User.find(@team.owner)
    @search = CaseSearch.new(params[:search])
    @cases = @search.scope
end

Я создал файл новой модели /models/case_search.rb для обрабатывать поиск:

class CaseSearch
attr_reader :date_from, :date_to

def initialize(params)
    params ||= {}
    @date_from = parsed_date(params[:date_from], 2.days.ago.to_date.to_s)
    @date_to = parsed_date(params[:date_to], Date.today.to_s)
end

def scope
    Case.where('closed_date BETWEEN ? AND ?', @date_from, @date_to)
end

private
    def parsed_date(date_string, default)
        Date.parse(date_string)
     rescue ArgumentError, TypeError
        default
    end
end

Ответы [ 2 ]

3 голосов
/ 25 мая 2020

Проблема заключается в следующих строках:

В контроллере:

@search = CaseSearch.new(params[:search])

В case_search вы получаете доступ к params[:date_from] и params[:date_to].

В представлении:

<%= text_field_tag 'Date from', @search.date_from %>
<%= text_field_tag 'Date to', @search.date_to %>

Из вышесказанного я предполагаю, что вы ожидаете, что params будет иметь структуру:

{search: {date_from: 'value', date_to: 'value'}}

Это не 'Не отражается в форме.

Строка text_field_tag 'Date from' сделает значение доступным под params['Date from'] в контроллере, что вам не нужно. Вместо этого измените представление на:

<%= text_field_tag 'search[date_from]', @search.date_from %>
<%= text_field_tag 'search[date_to]', @search.date_to %>

, чтобы оно соответствовало ожидаемой структуре.

В руководстве Обзор контроллера действий есть специальный раздел об этом:

4,1 Ha sh и параметры массива

params ha sh не ограничивается одномерными ключами и значениями. Он может содержать вложенные массивы и хеши. Чтобы отправить массив значений, добавьте пустую пару квадратных скобок «[]» к имени ключа:

GET /clients?ids[]=1&ids[]=2&ids[]=3

Фактический URL-адрес в этом примере будет закодирован как «/ clients? Ids % 5b% 5d = 1 & ids% 5b% 5d = 2 & ids% 5b% 5d = 3 ", поскольку символы" ["и"] "не допускаются в URL-адресах. В большинстве случаев вам не нужно беспокоиться об этом, потому что браузер будет кодировать его за вас, а Rails будет декодировать его автоматически, но если вам когда-либо придется отправлять эти запросы на сервер вручную, вы должны иметь это в виду. .

Теперь значение params[:ids] будет ["1", "2", "3"]. Обратите внимание, что значения параметров всегда являются строками; Rails не пытается угадать или привести тип.

Значения, такие как [nil] или [nil, nil, ...] в params, по умолчанию заменяются на [] из соображений безопасности. См. Руководство по безопасности для получения дополнительной информации.

Чтобы отправить ha sh, вы указываете имя ключа в скобках:

<form accept-charset="UTF-8" action="/clients" method="post">
  <input type="text" name="client[name]" value="Acme" />
  <input type="text" name="client[phone]" value="12345" />
  <input type="text" name="client[address][postcode]" value="12345" />
  <input type="text" name="client[address][city]" value="Carrot City" />
</form>

Когда это форма отправлена, значение params[:client] будет { "name" => "Acme", "phone" => "12345", "address" => { "postcode" => "12345", "city" => "Carrot City" } }. Обратите внимание на вложенный ha sh в params[:client][:address].

Объект params действует как Ha sh, но позволяет вам взаимозаменяемо использовать символы и строки в качестве ключей.

0 голосов
/ 25 мая 2020

Кажется, что ваш text_field_tag имеет другой ключ к тому, что вы пытаетесь получить. Попробуйте изменить на:

<%= text_field_tag :date_from, @search.date_from %>
<%= text_field_tag :date_to, @search.date_to %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...