Rails - передача параметров в link_to
На странице "Моя учетная запись" перечислены все учетные записи, и для каждой учетной записи есть ссылка на "+ Сервис"; это должно направлять пользователя на страницу /my _services/new и предварительно заполнить поле account_id соответствующим идентификатором, в зависимости от того, какая ссылка была нажата на странице индекса Учетные записи.
У меня есть debug (params) внизу каждой страницы, и с тем, что я пытаюсь, я не получаю ничего, кроме: controller и: действие, отображающееся в моих параметрах для /my _services/new page.
Ссылка, которую я пытаюсь, такова:
link_to "+ Service", "my_services/new", :account_id => acct.id
Затем у меня также есть логика в контроллере служб:
def new
@my_service = MyService.new
if params[:account_id]
@my_service.account_id = params[:account_id]
end
end
Может кто-нибудь помочь с правильным способом сделать это? Я еще не смог добиться этого с помощью нескольких неприятных маленьких взломанных вещей, которые я пробовал.
ИЗМЕНИТЬ
Оказывается, если кто-то смотрит на этот ответ в будущем, вложенные ресурсы (возможно, с опцией shallow: true
в routes.rb) кажутся способностью. Мои route.rb для этой части теперь выглядят так:
resources :accounts, shallow: true do
resources :services
end
Теперь мои ссылки выглядят следующим образом:
<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id } ) %>
Ответы
Ответ 1
Прежде всего, link_to является помощником html-тега, вторым аргументом является url, за которым следует html_options. Вы хотели бы передать account_id в качестве параметра url в путь.
Если вы правильно настроили именованные маршруты в route.rb, вы можете использовать помощники путей.
link_to "+ Service", new_my_service_path(:account_id => acct.id)
Я думаю, что наилучшей практикой является передача значений модели в качестве параметра, вложенного внутри:
link_to "+ Service", new_my_service_path(:my_service => { :account_id => acct.id })
# my_services_controller.rb
def new
@my_service = MyService.new(params[:my_service])
end
И вам нужно контролировать, что account_id разрешено для "массового присвоения". В rails 3 вы можете использовать мощные элементы управления для фильтрации правильных параметров в контроллере, где он принадлежит. Я очень рекомендую.
http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods
Также обратите внимание, что если account_id не устанавливается пользователем свободно (например, пользователь может только отправить услугу для отдельной учетной записи account_id, то лучше не отправлять ее по запросу, а устанавливать ее внутри контроллера добавив что-то вроде:
@my_service.account_id = current_user.account_id
Конечно, вы можете объединить эти два, если вы разрешаете пользователям создавать службы в своей собственной учетной записи, но разрешать администратору создавать кого-либо, используя роли в attr_accessible.
надеюсь, что это поможет
Ответ 2
Попробуйте это
link_to "+ Service", my_services_new_path(:account_id => acct.id)
он будет передавать account_id, как вы хотите.
Для получения дополнительной информации о link_to используйте http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to
Ответ 3
link_to "+ Service", controller_action_path(:account_id => acct.id)
Если он все еще не работает, проверьте путь:
$ rake routes