Вопрос по ruby-on-rails – Rails - передача параметров в link_to

64

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

Я имею отладку (params) внизу каждой страницы, и с тем, что я пытаюсь, я не получаю ничего, кроме: controller и: action, которые отображаются в моих параметрах для / 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 вариант вways.rb), кажется, путь. Мой route.rb для этой части теперь выглядит так:

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

Мои ссылки теперь выглядят так:

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

Ваш Ответ

3   ответа
99

link_to является помощником по тегу html, вторым аргументом является url, за которым следует html_options. То, что вы хотели бы, это передать account_id в качестве параметра url к пути. Если вы правильно настроили именованные маршруты в routs.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.

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

Error: User Rate Limit Exceeded
1
link_to "+ Service", controller_action_path(:account_id => acct.id)

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

$ rake routes
9

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

Похожие вопросы