link_to传递参数和显示问题 - 标记功能 - Ruby on Rails

时间:2010-04-15 02:36:16

标签: ruby-on-rails ruby

在我的上一个问题上,我得到了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

3 个答案:

答案 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] }}
                     )
                  )