Rails 4:在视图中链接关联对象

时间:2016-02-11 21:24:42

标签: ruby-on-rails-4 attr-accessible

好的,我搜索了整个网络,没有找到答案。 我正在寻找一种在帖子的节目视图中显示“类别”名称的方法(我不得不提到我是Rails中的新手)。

我有......

模型“发布

class Post < ActiveRecord::Base
    has_many :categories
    belongs_to :user
end

模型“类别

class Category < ActiveRecord::Base
    belongs_to :post
end

并且“帖子”的“显示”视图有这样的一行

<%= @post.category.name %>

屏幕截图错误消息: SQLEndTran

帖子”控制器中的“显示”操作:

def show
    @post = Post.find(params[:id])
end

我正在使用udemy上的一些过时的培训视频构建此应用。在此视频中,类别模型中有一行“attr_accessible”

class Category < ActiveRecord::Base

    attr_accessible :name           <---------------------- this
    has_many :posts
end

...但是自从Rails 4.0以来这已经不存在了。有没有其他方法来检索帖子的类别名称?

提前谢谢: - )

3 个答案:

答案 0 :(得分:1)

方法类别不存在,因为Post模型有许多“类别”而不是一个“类别”。邮政应该有方法“类别”。然后,如果您想在视图中显示帖子的第一个“类别”:

<%= @post.categories.first.name %>

如果要显示帖子的所有“类别”,则迭代集合:

<% @post.categories.each do |category| %>
<%= category.name %>
<% end %>

答案 1 :(得分:1)

我得到了答案。我发现,从产品视图中的表类别中获取数据的各方面都无法正常工作。我比thougt,在类别显示视图中显示类别是简单的工作。考虑到这个想法,我采用了相同的代码,这一个:

应用程序/视图/类别/ show.html.erb

<p>
  <strong>Name:</strong>
  <%= @category.category_name %>          <--------this line
</p>

...从类别show视图中将其放入post show视图中。我再次犯了一个错误,但不同:

- &GT;帖子中的 NoMethodError#show

好的,这表示实例变量“@category”不适用于post show视图。改变这很容易。我将对象从类别控制器的show动作复制到了posts控制器的show动作中。像这样:

class PostsController < ApllicationController
 .
 .
 .
  def show
    @post = Post.find(params[:id])
    @category = Category.find(params[:id])
  end

而且:它有效!!!! 但现在,这样做有什么不对吗?

干杯。

答案 2 :(得分:0)

我再次尝试并在我的代码中发现了真正的错误。 Rails没有设置外键。我必须手动完成。具有“belongs_to”的表(在我的情况下是posts表)需要添加一个外键(如category_id)。

首先创建迁移文件:

rails g migration add_foreign_key_to_posts_table

第二次将迁移代码添加到迁移文件中:

class AddForeignKeyToPostsTable < ActiveRecord::Migration
  def change
    add_foreign_key :posts, :categories
  end
end

第三次使用以下命令来迁移数据库迁移:

rake db:migrate

第四步,按照第一步到第三步为其他资源添加外键。现在一切正常。