在我的上一个问题上,我得到了KandadaBoggu的大量帮助,非常感谢。当我们被埋没在评论中时,我想打破这一部分。
我正在尝试在我正在开发的rails博客上创建标记功能。关系是Post has_many:tags和Tag belongs_to:post。在帖子中添加和删除标签效果很好。
在我的/view/posts/index.html.erb中我有一个名为tags的部分,我成功查询了Tags表,对它们进行分组并在tag_name旁边显示计数(作为旁注,我错误地称之为包含标记名称的列,'tag_name'而不仅仅是'name',因为我应该拥有)。此外,这些组的显示是引用PostsController中的索引方法的链接。这就是问题所在。
当你导航到/ posts时,你会收到一个错误,因为没有传递参数(没有点击标签组链接)。我有.empty?在那里所以不确定这里出了什么问题。这是错误和代码:
错误
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.empty?
/views/posts/index.html.erb
<% @tag_counts.each do |tag_name, tag_count| %>
<tr>
<td><%= link_to(tag_name, posts_path(:tag_name => tag_name)) %></td>
<td>(<%=tag_count%>)</td>
</tr>
<% end %>
PostsController
def index
@tag_counts = Tag.count(:group => :tag_name, :order => 'updated_at DESC', :limit => 10)
@posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].empty? ? {}:
{ :tags => { :tag_name => params[:tag_name] }}
)
)
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @posts }
format.json { render :json => @posts }
format.atom
end
end
答案 0 :(得分:0)
在这里您致电empty?
,如果params[:tag_name]
为零,则会引发您看到的错误。
@posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].empty? ? {}:
{ :tags => { :tag_name => params[:tag_name] }}
)
)
如果您只是关心它是否为零,您可以利用nil是假的事实并且这样做
@posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name] ?
{ :tags => { :tag_name => params[:tag_name] }} : {}
)
)
但这非常难看。做这样的事情可能会更好,以使你更清楚你正在做的事情:
@posts = if params[:tag_name]
Post.all
else
Tag.find_by_name(params[:tag_name], :include => :posts).posts
end
答案 1 :(得分:0)
当我给你解决方案时,我忘记了我用Nil
方法用empty?
类修补了猴子的事实。这就是它不适合你的原因。
按如下方式更改代码:
conditions, joins = {}, nil
unless(params[:tag_name] || "").empty?
conditions = ["tags.tag_name = ? ", params[:tag_name]]
joins = :tags
end
@posts=Post.all(:joins => joins, :conditions=> conditions)
修改1
上面的代码执行empty
检查而不是nil
检查。我总是做一个练习,对查询参数执行空检查。这包括从搜索表单调用操作的情况。在这种情况下,tag_name
不会为空,而是空字符串。
修改2
修正了多行问题。
编辑3
我在标签名称存在时修复了帖子没有显示问题。
编辑4
要以DESC顺序获取计数,请从order
来电中删除count
条款。
@tag_counts = Tag.count(:group => :tag_name, :limit => 10)
count
方法返回按count排序的有序哈希。您通过添加order
子句来更改默认排序顺序。
答案 2 :(得分:0)
您尝试访问的参数为nil,而不仅仅是空。解决这个问题的一种方法是调用nil?而不是空?在你的代码中。这对我有用:
@posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].nil? ? {}:
{ :tags => { :tag_name => params[:tag_name] }}
)
)