Рельсы-передача параметров в ссылку на
на странице индекса моих учетных записей перечислены все учетные записи, и для каждой учетной записи есть ссылка на "+ Service"; это должно направить пользователя на страницу /my_services/new и предварительно заполнить поле account_id соответствующим идентификатором, в зависимости от того, какая ссылка была нажата на странице индекса учетных записей.
у меня есть debug (params) в нижней части каждой страницы, и с тем, что я пытаюсь, я не получаю ничего, кроме: controller and :action, отображаемого в моих параметрах для /my_services / new страница.
ссылка, которую я пытался это:
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
может кто-нибудь помочь с правильным способом сделать это? Я еще не смог справиться с несколькими неприятными маленькими хакерскими вещами, которые я пробовал.
EDIT
оказывается, если кто-то смотрит на этот ответ в будущем, вложенные ресурсы (возможно, с в маршрутах.РБ) вроде бы есть путь. Мой маршрут.РБ для этой части теперь выглядит так:
resources :accounts, shallow: true do
resources :services
end
мои ссылки теперь выглядят так:
<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id } ) %>
3 ответа:
прежде всего, link_to является помощником тега html, его второй аргумент-url, а затем html_options. То, что вы хотели бы передать account_id в качестве параметра url к пути. Если вы правильно настроили именованные маршруты в routes.РБ, вы можете использовать помощников пути.
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.
надеюсь, что это помогает
попробуй такое
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