【问题标题】:Couldn't find Project with id=1 [WHERE "projects"."deleted_at" IS NULL]找不到 id=1 的项目 [WHERE "projects"."deleted_at" IS NULL]
【发布时间】:2014-06-08 09:38:17
【问题描述】:

我正在使用偏执狂宝石。

我的数据库中有一堆项目,但由于某种原因,它们的行为就像被删除了一样。当我导航到我的项目/1 路线时,我收到错误:

Couldn't find Project with id=1 [WHERE "projects"."deleted_at" IS NULL]

当我在控制台中输入时:

Project.find(1).deleted_at

我明白了

nil

这里发生了什么?

这是我的控制器显示操作:

def show
    @project = Project.find(params[:id])
    @comments = Comment.all.where(:project_id => @project.id)
    @updates = ProjectUpdate.all.where(:project_id => @project.id)
end

发生错误

@project = Project.find(params[:id])

以下是一些模型项目范围:

scope :by_category, lambda {|category| {:conditions => {:category_id => category.id}}}
scope :by_npo, lambda {|npo| {:conditions => {:npo_id => npo.id}}}

Project.find(1) 我得到:

=> #<Project id: 1, name: "project 1", npo_id: 1, description: "project1 description", location_id:
4, singular_unit: "1", past_tense_action: "past tense action", conversion: #<BigDecimal:7547d78,'0.1
5E1',18(45)>, created_at: "2014-05-13 00:12:33", updated_at: "2014-05-22 01:20:51", future_tense_act
ion: "future tense action", plural_unit: "2", amount1: #<BigDecimal:75475b0,'0.1E2',9(36)>, amount2:
 #<BigDecimal:7547520,'0.2E2',9(36)>, amount3: #<BigDecimal:7547490,'0.3E2',9(36)>, min_amount: nil,
 other_amount: true, short_description: "project1 short description", featured_image_id: 3, deleted_
at: nil>

我从我的索引页面链接到它 2ice(这是相关代码:

    <div class="pj">

      <h5><%= link_to project.name, project, :class => "button-link" %> </h5>
      <hr />
      <div class="index_featured_image">
        <%= link_to image_tag(project.get_featured_image, :alt => "Project Title", class: "featured_image"), project %>
      </div>
      <div class="proj-content">
        <p><strong><%= link_to project.npo.name, npo_path(project.npo) %></strong></br>
        <%= project.short_description %></p>
      </div>
      <div>
        <p class="project-loc"><i class="footicons fi-marker large"></i>  <%= project.location.city_state %></p>
      </div>
      <div class="text-center">
        <%= button_tag :type => "button", :class => "radius" do %>
          <%= link_to "View More", project, :class => "button-link" %>
        <% end %>
      </div>
    </div>

【问题讨论】:

  • 好问题 - 我想你是想显示 deleted_at 值?
  • 你能显示控制器 url 的方法/动作,你正在点击浏览器吗?
  • 您是否在跟踪已删除的记录?
  • 你在哪一行得到了错误?
  • 我在上面添加了我的控制器显示操作。不久前还有一个合作者安装了 paranoia gem(github.com/radar/paranoia)。我最近撤了,认为这可能是导致问题的原因

标签: sql ruby-on-rails ruby database ruby-on-rails-4


【解决方案1】:

几个猜测和一些建议。 首先是猜测。如果Project.find(params[:id]) 在表上调用WHERE "projects"."deleted_at" IS NULL 条件,则项目上必须有default_scope 调用。虽然它仍然很奇怪为什么 id 阻止 find 方法找到正确的项目,如果它真的没有被删除的话。让我看看 default_scope (或者最好只是将整个模型发布在一个要点中),我可能会说更多。

现在一些建议。它与当前的问题并没有真正的关系,但我相信,它会让你现在的 Rails 生活变得更轻松。

  1. 尽量不要使用过时的语法,继续使用新的语法。 例如。这些范围调用应该是这样的

    scope :by_category, ->(category){where(category_id: category.id)}
    
  2. 不要将.all.where 一起使用。你只是不需要它。 .where 调用将返回您正在寻找的 ActiveRecord::Relation 对象。

  3. 尽量减少控制器中实例变量的数量。例如,您可以在 show 操作中省略使用 @comments@updates 变量,前提是您已在 Project 模型上设置了所需的关联。

    has_many :comments
    has_many :updates, class_name: ProjectUpdate
    

    然后在视图中您可以将它们称为@project.cmets 和@project.updates,而无需单独存储它们。它会稍微清理一下控制器。另外,如果您想确保 cmets 和更新不会延迟加载,您可以通过调用 @project = Project.includes(:comments, :updates).find(params[:id]) 将它们与项目一起加载。

希望这会有所帮助。如果我有更具体的问题,我会更新答案。

【讨论】:

  • 我在错误的目录...不过感谢您的帮助!
猜你喜欢
  • 2022-12-17
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
相关资源
最近更新 更多