如何使Rails点击链接影响计数器?

时间:2017-09-25 18:30:08

标签: ruby-on-rails

在我的LinksController中,我有以下内容:

  def vote
    @link = Link.find(params[:link_id])
    @link.votes << Vote.create!(user_id: @link.user_id, link_id: @link.id)
    @link.totalcount = @link.votes.count
    @link.save
    redirect_to :root
  end

我也有以下路线:

           root GET    /                                   links#index
           link_vote GET    /links/:link_id/vote(.:format)      links#vote
      link_link_vote GET    /links/:link_id/link_vote(.:format) links#link_vote
      link_down_vote GET    /links/:link_id/down_vote(.:format) links#down_vote
               links GET    /links(.:format)                    links#index
                     POST   /links(.:format)                    links#create
            new_link GET    /links/new(.:format)                links#new
           edit_link GET    /links/:id/edit(.:format)           links#edit
                link GET    /links/:id(.:format)                links#show
                     PATCH  /links/:id(.:format)                links#update
                     PUT    /links/:id(.:format)                links#update
                     DELETE /links/:id(.:format)                links#destroy
                     GET    /                                   links#index

我能够击中路线并导致总数增加,甚至用另一种方法减少。然而,我正在努力争取link_vote的路线,下面的第一行:

    <td><%= link_to link.url, "http://#{link.url}", link_link_vote_path(link) %></td>
    <td><%= link.title %></td>
    <td><%= link.totalcount %></td>
    <td><%= link_to "UP", link_vote_path(link) %></td>
    <td><%= link_to "DOWN", link_down_vote_path(link) %></td>

My LinksController具有以下内容:

 def link_vote
     @link = Link.find(params[:link_id])
     @link.votes << Vote.create!(user_id: @link.user_id, link_id: @link.id)
     @link.totalcount = @link.votes.count
     @link.save
     redirect_to :root
 end

我尝试加载时收到以下内容:

undefined method `stringify_keys' for "/links/119/link_vote":String

我尝试在超链接之前添加link_link_vote_path(链接)。得到大致相同的消息:未定义的方法`stringify_keys&#39; for&#34; http://adamswilliamson.name&#34;:String。

我只是使用错误的路线或语法错误吗?

2 个答案:

答案 0 :(得分:0)

link_to(body, url, html_options = {})

link_to助手接受bodyurlhtml_options选项作为参数。你试图传递两个url,第二个是作为options参数的一部分进行威胁,第一个不是Rails可以使用的有效路径。

我认为您需要的是将插值网址作为正文传递,例如:

<%= link_to "http://#{link.url}", link_link_vote_path(link) %>

答案 1 :(得分:0)

我做错了几件事。首先,我重定向回到root而不是URL,这会将其保留在页面上并影响计数器,但我没有回击并刷新页面,所以我将其更新为以下内容:

 def link_vote
   @link = Link.find(params[:link_id])
   @link.votes << Vote.create!(user_id: @link.user_id, link_id: @link.id)
   @link.totalcount = @link.votes.count
   @link.save
   redirect_to @link.url
 end

然后提示有两个网址被传递,我能够将索引修复为:

<%= link_to link.url, link_link_vote_path(link) %> 

作品。感谢您的反馈。