Rails: изменение метода по умолчанию, вызываемого для объекта ActiveRecord :: Base, с помощью link_to - PullRequest
2 голосов
/ 13 января 2012

У меня есть гем, который, по сути, представляет собой просто набор классов ActiveRecord :: Base в пространстве имен гемов. Для всех них я получаю один и тот же тип проблемы. У меня есть модель ...

module MyGem
  class User < ActiveRecord::Base
    ...
  end
end

Тогда в моем приложении у меня есть маршруты ...

resources :users

Что облажалось в ссылке_to ...

<% @users.each do |user| %>
  <td><%= link_to 'Show', user %></td>
<% end %>

Я получаю ...

undefined method `my_gem_user_path' for #<#<Class:0x0000000305f728>:0x00000003055408>

Я пробовал разные вещи в route.rb, но я думаю, что решение может быть в том, чтобы сконфигурировать модель / link_to для вызова user_path (user) вместо my_gem_user_path (user) по умолчанию. Я просто не знаю, как, если это вообще возможно, сделать это.

Кто-нибудь знает лучшие практики здесь?

1 Ответ

0 голосов
/ 13 января 2012

Я думаю, что лучшая практика здесь - это пространство имен ваших маршрутов.Ваш класс именуется как MyGem :: User.#link_to использует #polymorphic_path, чтобы запросить у класса имя его класса, а затем вызывает #underscorize для этого имени класса, чтобы получить путь, поэтому предполагается, что путь будет my_gem_user_path, а не user_path.Это означает, что вызов ресурсов должен быть упакован следующим образом:

namespace(:my_gem) do
  resources :users
end

Затем my_gem_user_path преобразуется в MyGem :: UsersController.Убедитесь, что ваш контроллер так же расположен в пространстве имен.Если вы не хотите, чтобы маршрут разрешался этому контроллеру, вы можете указать имя контроллера в качестве опции для # resources.

edit: Это интересно, я не думал, что это столкнется с этой проблемой.Возможно, еще есть какая-то конфигурация, чтобы исправить это, поэтому я бы пока не пометил это как решенное.Вы всегда можете заменить polymorphic_path (который вызывается при использовании ориентированного на ресурс пути, как указано выше) именованными маршрутами.Например, вместо link_to «Пользователь», пользователь, вы всегда можете явно использовать link_to «Пользователь», my_gem_user_path Когда вы используете RESTful маршруты в вашем файле rout.rb (с методом #resources), он предоставляет вам эти именованные маршруты.

Для form_for синтаксис немного отличается:

form_for(@user, @task)

становится

form_for([@user, @task], :url => my_gem_user_my_gem_tasks_path(@user, @task), :method => :post)

для новой формы.Для формы редактирования это будет

form_for(@task, :url => my_gem_user_my_gem_tasks_path(@user, @task), :method => :put)

Имеет ли это смысл?Вот ссылка на документацию для form_for http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for

...