Почему эта ссылка на тег не указывает на правильную модель? - PullRequest
0 голосов
/ 24 марта 2011

Итак, вытащив мои волосы в течение часа, я решил опубликовать это здесь.Я получаю эту ошибку:

NoMethodError in Articles#show

Showing /home/leon/sites/VIS/app/views/articles/_article.html.erb where line #3 raised:

undefined method `user_path' for #<#<Class:0x7fdd81fe1eb8>:0x7fdd81fdfdc0>
Extracted source (around line #3):

1: <div id="left-column">
2:  <p class="label-b">Author<br>
3:     <%= link_to "#{@article.user.penname}'s profile", user_path(article.user) %> 

user_path (article.user)%>

Когда я пытаюсь связаться с автором статьи.Мой файл маршрутов:

  resources :tags

  get "admin/index"
  get "admin/show"
  get "articles/contact"
  get "articles/about"

  resources :roles

  devise_for :users, :controllers => { :registrations => "users/registrations" }

  resources :articles do
    resources :comments
  end

В моем файле модели статьи есть пользователь own_to: и статьи в моем файле модели has_many: article.Я использую эту ссылку для ссылки на профиль автора в статье.

Пожалуйста, помогите!Я использую can может для управления разрешениями и разработки для моей аутентификации, но она выдает ошибку в действии show статьи, поэтому я не опубликовал этот код.Дайте мне знать, если я должен.Спасибо!

@ Jacob

Я получаю ту же ошибку:

NoMethodError в статьях # show

Показ / home / leon / sites / VIS / app/views/articles/_article.html.erb, где поднята строка # 3:

неопределенный метод `user_path 'для # <#: 0x7fdd82217a98> Извлеченный источник (вокруг строки # 3):

1: 2: Автор
3: <% = link_to "# enj@article.user.penname профиля пользователя", article.user%> 4: Предыдущие версии 5: Версия 7

6: <% = image_tag"add-to-favourites.png",: class => "кнопка-избранное"%>

Соответствующая часть моих маршрутов:

{:action=>"destroy", :controller=>"roles"}
      new_user_session GET    /users/sign_in(.:format)                          {:action=>"new", :controller=>"devise/sessions"}
          user_session POST   /users/sign_in(.:format)                          {:action=>"create", :controller=>"devise/sessions"}
  destroy_user_session GET    /users/sign_out(.:format)                         {:action=>"destroy", :controller=>"devise/sessions"}
         user_password POST   /users/password(.:format)                         {:action=>"create", :controller=>"devise/passwords"}
     new_user_password GET    /users/password/new(.:format)                     {:action=>"new", :controller=>"devise/passwords"}
    edit_user_password GET    /users/password/edit(.:format)                    {:action=>"edit", :controller=>"devise/passwords"}
         user_password PUT    /users/password(.:format)                         {:action=>"update", :controller=>"devise/passwords"}
     user_registration POST   /users(.:format)                                  {:action=>"create", :controller=>"users/registrations"}
 new_user_registration GET    /users/sign_up(.:format)                          {:action=>"new", :controller=>"users/registrations"}
edit_user_registration GET    /users/edit(.:format)                             {:action=>"edit", :controller=>"users/registrations"}
     user_registration PUT    /users(.:format)                                  {:action=>"update", :controller=>"users/registrations"}
     user_registration DELETE /users(.:format)                                  {:action=>"destroy", :controller=>"users/registrations"}
     user_confirmation POST   /users/confirmation(.:format)                     {:action=>"create", :controller=>"devise/confirmations"}
 new_user_confirmation GET    /users/confirmation/new(.:format)                 {:action=>"new", :controller=>"devise/confirmations"}
     user_confirmation GET    /users/confirmation(.:format)                     {:action=>"show", :controller=>"devise/confirmations"}

Ага!У него нет маршрута для пользователя # show, но я не уверен, почему, поскольку у меня есть:

class UsersController < ApplicationController
...
  def show
    respond_to do |format|
      format.json { render :json => @user }
      format.xml  { render :xml => @user }
      format.html
    end

  rescue ActiveRecord::RecordNotFound
    respond_to_not_found(:json, :xml, :html)
  end

в моей папке app / controllers.Нужно ли переместить мой пользовательский контроллер в app / controllers / devise и перегрузить его с помощью devise вместо контроллера приложений?

Ответы [ 4 ]

1 голос
/ 24 марта 2011

Вы можете сделать:

 <%= link_to "#{@article.user.penname}'s profile", article.user %> 

И Rails автоматически определит маршрут.

Как видно здесь:

http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

Обновление

Да, вам придется наследовать от DeviseController, а не ApplicationController. Отсюда вы можете добавить свои собственные пользовательские действия, такие как show (что вы и делаете сейчас).

Посмотрите на: https://github.com/plataformatec/devise

и поиск: Настройка контроллеров

0 голосов
/ 24 марта 2011

Разве это не должно быть просто: @article.user вместо article.user ??

<%= link_to "#{@article.user.penname}'s profile", @article.user %>

Почему вы используете переменную экземпляра для имени пользователя и локальную переменную для объекта пользователя? Я думаю, что это твоя проблема.

0 голосов
/ 24 марта 2011

Я понял это.Поработав с маршрутами некоторое время и прочитав документацию по rails, я добавил эту строку в свой файл маршрутов:

devise_for: users,: controllers => {: registrations => "users / registrations"}

ресурсы: пользователи,: only => [: index,: show] <== ЭТА ЛИНИЯ </p>

ниже моих devise_for маршрутов.Это позволяет мне отображать профили пользователей, не беспокоясь об обновлениях редактирования и т. Д., Которые предусмотрены разработанным устройством.В любом случае, спасибо за ответы, ребята, я ценю это!

0 голосов
/ 24 марта 2011

Попробуйте article.user вместо user_path(article.user).Если это не сработает, вы можете опубликовать вывод из rake routes?

...