Ошибка url_helper при слиянии в обязательном параметре - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь объединить значение с хешем params и передать полученный хеш помощнику url. (Использование Rails 5)

Например. У меня есть следующие маршруты

routes.rb

get 'test-url/:arg_1' => 'test#test_action_1', :as => 'test_test_action_one'
get 'test-url/:arg_1/:arg_2' => 'test#test_action_2', :as => 'test_test_action_two'

Пользователь посещает /test-url/value-1, и я хочу создать ссылку в представлении на /test-url/value-1/value-2

в файле просмотра

link_to test_test_action_two_url(params.permit(:arg_1).merge(arg_2: 'value-2'))

Я получаю следующую ошибку:

No route matches {:action=>"test_action_2", :arg_1=>"value-1", "arg_1"=>"value-1", "arg_2"=>"value-2", :controller=>"test"} missing required keys: [:arg_2]

Под капотом объект ActionController::Parameters поддерживает внутренний хэш (with_indifferent_access). После merge хэш все еще имеет indifferent_access, и вы можете получить доступ к arg_2, используя символ или строку.

Однако я не уверен, почему генератору URL не удается найти ключ :arg_2 ...

1 Ответ

0 голосов
/ 12 ноября 2018

ActionController::Parameters использует HashWithIndifferentAccess, в котором ключи хранятся в виде строки вместо символов. Но для маршрутизации помощников URL необходимо, чтобы аргументы были в символьных ключах. Таким образом, как указано в ошибке, arg_2 должен быть в символьном ключе.

Почему Rails `HashWithIndifferentAccess` хранит ключи как строки, а не символы?

Попробуйте создать новый обычный хэш:

test_test_action_two_path({arg_1: "value_1", arg_2: "value_2"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...