Подтвердить что ты не робот

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 } ) %>
4b9b3361

Ответ 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.

надеюсь, что это поможет

Ответ 3

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

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

$ rake routes