Rails 4错误:ActiveRecord :: RecordNotFound /无法找到' id' =

时间:2016-09-04 16:34:47

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord controller


我对rails和我的第一个应用程序编码相当新。只是无法弄清楚如何在我的控制器中定位以下内容。

控制器

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)

这是有效的,所以问题必须存在。我根本无法弄明白。

在此先感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

归因于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 :(得分:1)

他们的关键是你的索引控制器中没有params [:id]。删除此行:     @tool = Tool.find(params [:id])

而不是@tool在视图中仅使用'工具'

答案 2 :(得分:1)

你实际上不需要这一行:

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

如果您在索引视图中,则需要显示所有工具,而不仅仅是一个。那将是:show view。你在索引视图中没有params [:id],你没有在url中指明它。

所以:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<body ng-app="sample">
  <div ng-controller="samplecontroller">
    <table>
      <tr ng-repeat="value in values">
        <td>{{value.name}}<td>
        <td ng-class="{'test-false': value.booleanField !== 'true'}">{{value.booleanField}}</td>
      </tr>
    </table>
  </div>
</body>

答案 3 :(得分:1)

在此之前已经有很多正确答案的正确答案,但我想多做一些,然后给你解决方案。

事实上是什么  function scrollBanner() { var scrollPos = window.scrollY; if (scrollPos <= 400) { [].forEach.call( document.querySelectorAll('.img-paralax, .img-paralax2'), function(node) { node.style.transform = "translateY(" + (-scrollPos/3) +"px" + ")"; var text = node.querySelector('h1'); text.style.transform = "translateY(" + (-scrollPos/3) +"px" + ")"; text.style.opacity = 1 - scrollPos/400; } ); } } 是的,它将从您的URL获取ID ..

让我们说你有你的broswer

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

这样你就可以获得身份证参数。

这里的优点是,你在索引上...每次你去索引“网站”(准确的索引视图),在你的网址上你会看到类似

的内容
http://localhost:3000/tool/1

这就是为什么你得到这个错误“URL上没有ID”

但ruby on rails就像任何其他语言一样,你需要理解它,而DAMM ruby​​就是那个......而且对于ruby来说...... ttp://localhost:3000/tools 这个小'的意思是你想要看到你的所有工具,所以不需要发送一个ID,另一方面你SHOW会显示你的一个通行费,给你网址Tools != Tool,或者换句话说,您将看到ID = 1

的工具

事实上,你想要的控制器索引是什么,以显示你的所有工具..

@tools = Tool.all

或与你有关系的东西current_user和收藏列表