我在Rails 3.2应用程序中加入了自我。它似乎在控制台中工作,但在视图中,我似乎无法访问class_name的任何关联。这是我的代码:
class Comment < ActiveRecord::Base
belongs_to :profile
belongs_to :author, :class_name =>"User", :foreign_key => "author_id"
def author_name
author.profile.name
end
end
class Profile < ActiveRecord::Base
belongs_to :user
has_many :comments
end
上面的差异是个人资料有很多评论。但是,用户可以将另一个配置文件作为作者发表评论。
所以,如果我在控制台中运行类似:
Comment.first.author_name
我会得到一个字符串结果,如“测试作者”
但是,如果我在使用@comments呈现的部分_comment.html.erb中调用<%= comment.author_name %>
,则会收到以下错误:
ActionView::Template::Error (undefined method `profile' for nil:NilClass):
我使用以下行在创建操作中的author_id
中分配comments_controller
:
@comment = Comment.new(params[:comment].merge(:author_id => current_user.id))
个人资料和评论控制器:
class CommentsController < ApplicationController
def create
@comment = Comment.new(params[:comment])
if @comment.save!
@profile = @comment.profile
Resque.enqueue(CommentWorker, @comment.id)
respond_to do |format|
format.js { }
end
else
respond_to do |format|
format.js { render 'fail.js.erb' }
end
end
end
end
class ProfilesController < ApplicationController
def show
@profile = Profile.find(params[:id])
@user = User.find(@profile.user_id)
@comments = @profile.comments
end
end
视图(按部分加载的顺序:
在profiles/_logged_in.html.erb
内(在profiles/show.html.erb
中调用)
<%= render :partial => 'profile_cred' %>
profiles/_profile_cred_in.html.erb
<% if current_user_profile?(@profile) %>
<%= render :partial => "comments/auth_user_comments" %>
<% else %>
<%= render :partial => "comments/user_comments" %>
<% end %>
profiles/_auth_user_comments.html.erb
<% if @comments.count == 0 %>
<p id="commentIntro">You have no comments yet, <%= "#{@profile.first_name}" %>.</p>
<% elsif @comments.count > 0 %>
<p id="commentIntro"><%= "#{@profile.first_name}" %> is most likely to:</p> <ul id="commentInfo"><%= render @comments, :locals => {:comment_count => @comments.length} %>
<% end %></ul>
profiles/_user_comments.html.erb
<div id="newComment">
<p id="commentIntro"><%= @profile.first_name %> is: </p><%= render :partial => 'comments/form', :locals => {profile: @profile} %>
</div>
<div id="list">
<ul id="commentInfo">
<% if @comments.count > 0 %>
<%= render @comments %>
<% end %>
</ul>
</div>
comments/_comment.html.erb
<li id="<%= comment.id %>" class="comment">
<span title="<%= comment.author_name %>"><%= comment.body %><% if current_user_profile?(@profile) %><p class="deleteSup"><%= link_to 'x', comment_path(comment.id), :method => :delete, :remote => true, :confirm => "Are you sure you want to remove this comment?" %></p><% end %></span>
我不知道为什么这在控制台中有效但在视图中无效。有什么想法吗?
修改
在呈现comments/user_comments
的代码时会抛出错误,例如,如果我正在查看我在其他人的个人资料中发表的评论,则会调用该代码。当我在这里调试我的输出时:
#<Comment id: 32, profile_id: 1, author_id: 45, body: "test", created_at: "2012-12-15 05:12:00", updated_at: "2012-12-15 05:12:00">,
#<Comment id: nil, profile_id: 1, author_id: nil, body: nil, created_at: nil, updated_at: nil>]
我认为这是因为以comments/user_comments
部分存在的形式实例化新的评论,但我不知道。这是表单代码:
<% if logged_in? and not current_user_profile?(profile) %>
<%= form_for(profile.comments.new, :remote => true, :html => {:id =>"new_comment"}) do |f| %>
<%= f.hidden_field :profile_id, :value => profile.id %>
<%= f.hidden_field :author_id, :value => current_user.id %>
<div class="holds">
<%= content_tag(:span, "ex: change the world", :class =>"holder_comment") %>
<%= f.text_field :body, :autofocus => true %>
</div>
<%= f.submit 'Add' %>
<% end %>
<% end %>
答案 0 :(得分:1)
我想我明白了。在其中一个部分中,我有一个@profile.comments.new
的表单,它使用profile_id
初始化一个nil注释。所以这就搞砸了。用form_for Comment.new
替换它并为hidden_field
添加profile_id
有帮助。
答案 1 :(得分:0)
你能写一下你在控制器和视图中的代码吗?另外,在调用部分内容之前,您可以调试@comments上的内容吗?
在您的观点中执行此类操作之前:
<%= render :partial => "comment", :collection => @products %>
评论代码并执行类似
的操作<%= debug @products %>
<%# render :partial => "comment", :collection => @products %>
另外,您可能想尝试
<%# render :partial => "comment", :collection => @products.all %>
因为您可能正在传递ActiveRecord关系而不是产品集合并且可能是错误的