Ошибка Rails 4: ActiveRecord :: RecordNotFound / Не удалось найти 'id' =…

Контроллер

def index
  @tool = Tool.find(params[:id])
  @favorites = current_user.favorites
  @tools = Tool.where(user_id: current_user).order("created_at DESC")
  @user = current_user
end

Индексный просмотр

%h2 My Favorite Tools
- @favorites.each do |tool|
    = image_tag tool.cover_filename.url
    %h2= link_to tool.title, tool
    %p= tool.subtitle
    %p= @tool.impressionist_count
    %p= link_to @tool.get_upvotes.size, like_tool_path(@tool), method: :get
    %p= link_to "Edit", edit_tool_path(tool)
    %p
        http://ocubit.com/tools/
        = @tool.id
    %p= time_ago_in_words(tool.created_at)

%h2 My Tools
- @tools.each do |tool|
    = image_tag tool.cover_filename.url
    %h2= link_to tool.title, tool
    %p= tool.subtitle
    %p= @tool.impressionist_count
    %p= link_to "Edit", edit_tool_path(tool)
    %p
        http://ocubit.com/tools/
        = @tool.id
    %p= time_ago_in_words(tool.created_at)


= link_to "View Your Profile", '/users/'+@user.id.to_s

-if @user.use_gravatar?
    = image_tag gravatar_for @user
- else
    = image_tag @user.avatar_filename.url

%h1= @user.username

= link_to "Edit", edit_user_registration_path

Если я запустил это в своем браузере, появится следующая ошибка:

ActiveRecord::RecordNotFound in ToolsController#index
Couldn't find Tool with 'id'=


Я уже сменил свой контроллер на (для тестирования)

@tool = Tool.find(1)

И это работает, значит, проблема должна быть. Просто не могу понять.

Заранее спасибо за помощь!

1
Gugubaight 4 Сен 2016 в 19:34

4 ответа

Лучший ответ

На самом деле вам не нужна эта строка:

@tool = Tool.find (params [: id])

Если вы находитесь в режимах просмотра индекса, вы хотите показать все инструменты, а не только один. Это будет для вида: show. У вас нет params [: id] в представлении индекса, вы не указываете это в URL-адресе.

Так:

def index
  @user = current_user
  @favorites = @user.favorites
  @tools = @user.tools.order("created_at DESC")
end



%h2 My Favorite Tools
- @favorites.each do |tool|
    = image_tag tool.cover_filename.url
    %h2= link_to tool.title, tool
    %p= tool.subtitle
    %p= tool.impressionist_count
    %p= link_to tool.get_upvotes.size, like_tool_path(tool), method: :get
    %p= link_to "Edit", edit_tool_path(tool)
    %p
        http://ocubit.com/tools/
        = tool.id
    %p= time_ago_in_words(tool.created_at)

%h2 My Tools
- @tools.each do |tool|
    = image_tag tool.cover_filename.url
    %h2= link_to tool.title, tool
    %p= tool.subtitle
    %p= tool.impressionist_count
    %p= link_to "Edit", edit_tool_path(tool)
    %p
        http://ocubit.com/tools/
        = tool.id
    %p= time_ago_in_words(tool.created_at)


= link_to "View Your Profile", '/users/'+@user.id.to_s

-if @user.use_gravatar?
    = image_tag gravatar_for @user
- else
    = image_tag @user.avatar_filename.url

%h1= @user.username

= link_to "Edit", edit_user_registration_path
1
adriandelarco 4 Сен 2016 в 17:04

Это связано с тем, что params[:id] равно nil. Попробуйте открыть этот URL, а затем измените код на:

# open this URL to pass parameter tool_id
http://localhost:3000/favorites?tool_id=1

# in view 
<%= link_to "Favorites", favorites_path(tool_id: 1) %>

# controller
def index
  @tool = Tool.find(params[:tool_id])
end
1
Tan 4 Сен 2016 в 16:58

Ключевым моментом является то, что у вас нет params [: id] в вашем контроллере индекса. Удалите эту строку: @tool = Tool.find (params [: id])

Вместо @tool используйте в вашем представлении просто "инструмент"

1
gmrash 4 Сен 2016 в 17:02

Перед этим уже есть много правильных или правильных ответов, но я хотел бы сделать немного больше, чем дать вам решение.

Перед этим уже есть много правильных или правильных ответов, но я хотел бы сделать немного больше, чем дать вам решение.…

Скажем, у вас есть в вашем браузере

http://localhost:3000/tool/1

Это вы получите свой идентификатор как номер один.

Замечательное НО здесь то, что вы находитесь в своем индексе ... и каждый раз, когда вы заходите на свой индексный "сайт" (точнее, просмотр индекса), на вашем URL вы увидите что-то вроде

ttp://localhost:3000/tools

Вот почему вы получаете эту ошибку "URL не имеет идентификатора"

Но рубин на рельсах похож на любой другой язык, и вам нужно его понимать, а рубин DAMM на этом языке значителен .. и для рубина .. Tools != Tool этот маленький значок означает, что вы хотите видеть ВСЕ свои инструменты, поэтому нет необходимости отправлять с ним идентификатор, с другой стороны, вы ПОКАЗЫВАете, чтобы показать вам ОДИН из ваших платных вызовов, дав вам URL-адрес http://localhost:3000/tool/1, или другими словами, вы увидите свой инструмент с ID = 1

Фактически, вы хотите, чтобы в вашем индексе контроллера отображались все ваши инструменты, так что ...

@tools = Tool.all

Или что-то с отношениями с вами current_user и списком избранных

1
Filipe Santiago 4 Сен 2016 в 17:59