Rails 4 - Polymorphic associations - 多重关联

Rails 4 - Polymorphic associations - multiple associations

我正在尝试制作一个 Rails 4 应用程序。

我有一个多态的评论模型。我还有用户、个人资料和文章的模型。

协会是:

article.rb

belongs_to :user
has_many :comments, as: :commentable
accepts_nested_attributes_for :comments

comments.rb

belongs_to :user
belongs_to :commentable, :polymorphic => true

profile.rb

belongs_to :user
has_many :addresses, as: :addressable

user.rb

has_many :articles
has_many :comments
has_one :profile

我很难理解这在实践中是如何工作的。

当我使用控制台创建评论时,如下所示:

Comment.create(commentable: Article.first, user_id: "1", opinion: "test") Article Load (15.5ms) SELECT "articles".* FROM "articles" ORDER BY "articles"."created_at" DESC LIMIT 1 (0.2ms) BEGIN SQL (6.3ms) INSERT INTO "comments" ("commentable_id", "commentable_type", "user_id", "opinion", "created_at", "updated_at") VALUES (, , , , , ) RETURNING "id" [["commentable_id", 3], ["commentable_type", "Article"], ["user_id", 1], ["opinion", "test"], ["created_at", "2016-01-01 01:51:20.711415"], ["updated_at", "2016-01-01 01:51:20.711415"]] (1.3ms) COMMIT => #

有效。

但是,当我转到视图并尝试使用表单创建新评论时,我得到:

SELECT  "articles".* FROM "articles" WHERE "articles"."id" =   ORDER BY "articles"."created_at" DESC LIMIT 1  [["id", 3]]
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" =   ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
Unpermitted parameter: comment
   (0.2ms)  BEGIN
   (0.1ms)  COMMIT
[ActiveJob] Enqueued Searchkick::ReindexV2Job (Job ID: 4fd1ceb5-7882-4381-a2df-5913082af621) to Inline(searchkick) with arguments: "Article", "3"

没有任何反应。

此外,我尝试按照本视频教程中的示例进行操作(大约 7m:30s):

https://gorails.com/episodes/comments-with-polymorphic-associations?autoplay=1

我更改了我的部分评论,它正在努力显示在控制台中创建的评论(但不是在视图表单中)来自:

<% @article.comments.each do | comment | %>
  <div class="well">
    <%= comment.opinion %>
    <div class="commentattribution">
      <%= comment.user.formal_name_and_title %>
    </div>
  </div>
<% end %>

在我呈现部分评论的文章显示页面中添加局部变量:

<%= render 'comments/display', locals: {commentable: @article} %>

并将开头行中的@article 替换为@commentable:

<% @commentable.comments.each do | comment | %>
  <div class="well">
    <%= comment.opinion %>
    <div class="commentattribution">
      <%= comment.user.formal_name_and_title %>
    </div>
  </div>
<% end %>

现在,当我保存它并尝试呈现文章展示页面时,我收到此错误:

undefined method `comments' for nil:NilClass

我不明白这条错误消息是什么意思,但一切正常,直到我尝试引用 commendable 而不是 article。错误消息中引用的特定行项目是:

<% @commentable.comments.each do | comment | %>

谁能看出这里出了什么问题?

当我尝试时:

<% commentable.comments.each do | comment | %>

我收到这个错误:

undefined local variable or method `commentable' for #<#<Class:0x007fd13b93dac8>:0x007fd134530270>

我读过一些其他帖子,其中人们遇到了属于多个资源的多态关联的问题。比如我的评论属于用户,也属于文章。我一直未能按照决议或正确把握该安排的问题。

Joe Half Face 的解决方案适用于评论表单,但现在唯一不起作用的部分是让撰写文章的用户的姓名出现在页面上。

在我的文章展示页面,我有:

<div class="articletitle">
                    <%= @article.title %>
                </div>    
                <div class="commentattributionname">
                    <%= @article.user.try(:formal_name) %>
                </div>
                <div class="commentattributiontitle">
                    <%= @article.user.try(:formal_title) %>
                </div>
                <div class="commentattributiondate">
                    <%= @article.created_at.try(:strftime, '%e %B %Y') %>
                </div>

标题、节目和创建日期节目,但用户属性均未出现。

代码检查器中显示的只是一个空白 div 容器。

1) 如果您将变量传递给部分变量,它将作为本地变量,而不是实例变量:

<%= render :partial => 'comments/display', locals: {commentable: @article} %>

2) 另请注意,从控制器渲染和从视图渲染是不同的事情。在控制器中,您不必指定 :partial=>,因为 Rails 中的控制器应该呈现整个模板,但是如果您在视图文件中,您应该因为 Rails 每个请求只能呈现一个模板