通过自定义方法和form_for增加模型整数

时间:2014-12-26 06:19:34

标签: ruby-on-rails forms methods rails-routing

我对Rails非常陌生,所以如果这是一个简单的问题我会道歉。我正在尝试建立一个简单的网站,允许用户投票,因为他们是否喜欢那天的午餐。午餐与提供者(餐馆)相关联,因此提供者将有许多不同的“午餐”。

我知道可以通过将其添加到控制器(discussed more here)中的方法来自动增加,并且我当前的设置如下所示:

观点:

<%-# Show current like and dislike counts. -%>
<div> Likes: <%= @lunch.liked %> </div>
<div> Dislikes: <%= @lunch.disliked %> </div>


<div>
    <%= form_for :lunch url: lunch_path, method: :put do |f| %>
      <div><%= f.hidden_field :disliked %></div>
      <div><%= f.hidden_field :id %></div>
    <%= f.submit "Disike Lunch", class: "btn btn-large btn-primary" %>
    <% end %>
</div>

控制器:

  def downvote_lunch
    @lunch = Lunch.find(params[:id])
    @lunch.increment!(:disliked)
    redirect_to lunch_path
  end

路线:

 resources :lunches

...

match '/dislike',      to: 'lunches#downvote_lunch',      via: 'get'

但是,当我点击“不喜欢按钮”时,它告诉我没有“更新”视图 - 我已将更新定义为控制器中的空方法,但我不确定为什么它会访问更新 - 我正在寻找的是重新加载午餐/:id以及“不喜欢”的更新计数。

我的问题:如何让表单指向自定义的“downvote_lunch”方法,并在成功递增“dislikes”整数后将其重定向回lunches /:id模型?

1 个答案:

答案 0 :(得分:0)

你必须这样做

在视图中

 <div>
   <%= form_for :lunch url: downvote_lunch_lunch_path(params[:id]), method: :put do |f| %>
    <div><%= f.hidden_field :disliked %></div>
    <div><%= f.hidden_field :id %></div>
   <%= f.submit "Disike Lunch", class: "btn btn-large btn-primary" %>
  <% end %>
</div>

路线

 resources :lunches do
  member do
    put :downvote_lunch
  end
 end

在控制器中

  def downvote_lunch
    @lunch = Lunch.find(params[:id])
    @lunch.increment!(:disliked)
    redirect_to @lunch
  end

它会按你的意愿工作