Рельсы-передача параметров в ссылку на


на странице индекса моих учетных записей перечислены все учетные записи, и для каждой учетной записи есть ссылка на "+ 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 59

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

link_to "+ Service", controller_action_path(:account_id => acct.id)

если он все еще не работает проверьте путь:

$ rake routes