2012-05-27 3 views
55

На моей странице Индексная книжка содержит все учетные записи, а на каждую учетную запись есть ссылка на "+ Сервис"; это должно направить пользователя на страницу/my_services/new и предварительно заполнить поле account_id соответствующим идентификатором, в зависимости от того, какая ссылка была нажата на странице индекса Учетных записей.Rails - параметры для передачи в link_to

У меня есть отладка (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 

Может кто-то помочь с правильным способом сделать это? Я еще не смог с этим справиться с несколькими неприятными маленькими хакерскими вещами, которые я пробовал.

EDIT

Оказывается, если кто-то смотрит на этот ответ в будущем, вложенные ресурсы (возможно, с shallow: true опции в routes.rb), как представляется, путь. Мой routes.rb для этой части теперь выглядит следующим образом:

resources :accounts, shallow: true do 
    resources :services 
end 

Мои ссылки выглядеть следующим образом:

<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id }) %> 

ответ

85

Прежде всего, link_to является вспомогательным HTML тег, его второй аргумент является URL, а затем html_options. Вы хотели бы передать account_id в качестве параметра url в путь. Если вы правильно настроили именованные маршруты в routes.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.

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

+0

Интересно, если это будет работать link_to "Сервис", "? My_services/новый account_id =" + acct.id –

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

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

$ rake routes 
Смежные вопросы