【问题标题】:link_to passing paramater and display problem - tag feature - Ruby on Railslink_to 传递参数和显示问题 - 标记功能 - Ruby on Rails
【发布时间】:2023-04-06 11:07:02
【问题描述】:

我在最后一个问题上从 KandadaBoggu 那里得到了很多帮助,对此我非常感谢。当我们被埋在 cmets 中时,我想打破这部分。

我正在尝试在我正在开发的 rails 博客上创建一个标签功能。关系是 Post has_many :tags 和 Tag belongs_to :post。在帖子中添加和删除标签效果很好。

在我的 /view/posts/index.html.erb 中有一个名为 tags 的部分,我在其中成功查询了 Tags 表,对它们进行分组并在 tag_name 旁边显示计数(作为旁注,我错误地将包含标签名称的列,'tag_name' 而不是我应该有的'name')。此外,这些组的显示是一个链接,它引用 PostsController 中的 index 方法。这就是问题所在。

当您导航到 /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

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    当我给你解决方案时,我忘记了我用 empty? 方法修补了我的 Nil 类的事实。这就是它不适合您的原因。

    修改代码如下:

    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 将不是 nil,而是一个空字符串。

    编辑 2

    修复了多行问题。

    编辑 3

    我修复了标签名称存在时帖子不显示的问题。

    编辑 4

    为了按 DESC 顺序获取计数,请从您的 count 调用中删除 order 子句。

    @tag_counts = Tag.count(:group => :tag_name, :limit => 10)
    

    count 方法返回按计数排序的有序哈希。您通过添加 order 子句更改了默认排序顺序。

    【讨论】:

    • 再次感谢您的帮助。上面给出的 4 个块中我工作的唯一代码是 BaroqueBobcat 发布的第二组代码,但它在索引视图中多次显示该帖子。事实上,它显示的次数与帖子的标签数量直接相关。关于如何解决这个问题的任何想法?
    • 只是为了澄清,它只是在索引视图中重复,而不是在您通过单击标签组传递参数时。
    • 我已经更新了答案。仅当存在 tag_name 时,此修复程序才会使用连接。
    • 我无法让该代码工作。我使用 BaroqueBobcat 的代码创建了一个新问题来尝试解决这个问题。您在上面给我的代码最终会显示在帖子中,当单击标签组时,它只显示第一次搜索,之后就不起作用了。对不起,再次感谢您的帮助。
    • 我已经解决了这个问题。完整复制代码。我在代码示例中使用if 而不是unless。我已经对此进行了测试,并且可以正常工作。
    【解决方案2】:

    在这里您调用empty?,如果params[:tag_name] 为nil,它将引发您看到的错误。

    @posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].empty? ? {}: 
                         { :tags => { :tag_name => params[:tag_name] }}
                         )
                      )
    

    如果你只关心它是否为 nil,你可以利用 nil 是 false 的事实来做这个

    @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
    

    【讨论】:

    • 好的,标签组链接工作得很好,登陆/posts没有错误,但有两件事:第一,它似乎连续显示每个帖子条目三次,第二它只显示实际有标签的帖子(三次)。任何想法(如果你不知道,对 ruby​​ 来说是新的)。感谢您的帮助。
    • 另外,我尝试了最后一个已清理的解决方案,但无法识别“页面”。
    • 其实刚看,重复显示与帖子的标签数量直接相关。三个标签 = 显示 3 次,等等。
    • 只是为了澄清,它只是在索引视图中重复,而不是在您通过单击标签组传递参数时。
    • 那是因为 @tag_counts.each 你可以再次检查那里的参数并以不同的方式呈现,但最好只做一个新的操作来处理显示带有特定标签的页面。
    【解决方案3】:

    您尝试访问的参数是 nil,而不仅仅是空的。解决此问题的一种方法是调用 nil?而不是空的?在你的代码中。这对我有用:

    @posts=Post.all(:joins => :tags,:conditions=>(params[:tag_name].nil? ? {}: 
                         { :tags => { :tag_name => params[:tag_name] }}
                         )
                      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多