使用form_for和model中定义的方法写入db

时间:2010-09-08 12:47:17

标签: ruby-on-rails

我想在一个对象上实现一个类似的计数器。每次点击“我喜欢”按钮时,我想更新对象的数据库字段。

在控制器show-view中,我放置了以下形式:

<% form_for(@book) do |f| %>
 <p>
  <% @book.update_like(@book)%>
  <%= f.submit "I like" %>
 </p>
<% end %>

在book.rb模型中调用update_like方法,如下所示:

def update_like(in_book)
    in_book.like_tag = in_book.like_tag + 1;    
end

调用update_like方法,但数据库不更新。我不明白出了什么问题。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

您需要保存对象

def update_like(in_book)
    in_book.like_tag = in_book.like_tag + 1
    save
end

但更好的做法是在你的控制器中做到这一点。

答案 1 :(得分:0)

你不知道ruby on rails的概念;)

你不能这样做,你必须调用一个控制器方法来更新数据库记录。

您正在寻找的是link_to_remote(这不适用于Rails 3 !!)

查看:http://apidock.com/rails/ActionView/Helpers/PrototypeHelper/link_to_remote

所以你创建一个控制器让我们说“CommentsController”并添加一个像“like_it”这样的动作

然后一切都会像:

<强>控制器:

class CommentsController < ApplicationController

  def like_it

    @book = Book.find(params[:id])
    @book.update_like

    render :nothing => true

  end

end

<强>型号:

class Book < ActiveRecord::Base

  def update_like
    self.like_tag += 1
    self.save

  end

end

在您看来:

link_to_remote "I like it!!", :url => { :controller => 'comments', :action => 'like_it', :id => placeCommentIDHere }, :complete => 'alert('You liked it!!');'

我查看了你的个人资料,发现你也来自瑞士!也许你说德语,如果你这样做,你应该读这本书(它是免费的!):http://openbook.galileocomputing.de/ruby_on_rails/

PS:Rails 3.0中不再支持link_to_remote !!

Gruess

西蒙;)