尝试在rails中创建一个新方法并获取一个nomethoderror undefined方法

时间:2011-08-10 22:56:24

标签: ruby-on-rails-3

  def create 
    msg = current_user.msgs.build(params[:msg])
    msg.message = msg.message[0..140]
    msg.created_at = Time.now # HACK
    if msg.save
    else
      flash[:error] = "Your article must contain some text."
    end
    redirect_to root_path
  end

我想添加类似

的内容
msg.title = msg.title
msg.byline = msg.byline

这样我就可以拥有与每条消息相关联的标题和署名,但如果我这样做,我会收到错误

   NoMethodError in Home#index

   Showing /Users/fred/Desktop/demosite/app/views/home/index.html.erb where line #25 raised:

   undefined method `title' for #<msg:0x00000104dbcn90>

如何添加标题和署名以便我不会获得nomethoderrors?感谢

1 个答案:

答案 0 :(得分:1)

首先:什么?

msg = current_user.msgs.build(params[:msg])
msg.message = msg.message[0..140]
msg.created_at = Time.now # HACK

这让我们感到困惑。你为什么要这样:

1)限制控制器中的消息长度 而不是模型上的before_save

before_save :only_140_characters

def only_140_characters
  self.message = self.message[0..140]
end

2)在控制器中自己设置created_at?这由Rails自动处理。创建记录时,created_at字段将由ActiveRecord设置为值。同样,更新记录时updated_at也将设置为当前时间。如果您的字段确实存在,Rails将只执行此操作。


现在谈到真正的问题:为什么你得到那个未定义的方法错误?

apneadiving在添加迁移以将该列添加到messages表所需的注释中正确指出。您可以通过运行以下命令来执行此操作:

rails g migration add_title_to_messages title:string

然后通过运行rake db:migrate,该列将被添加到数据库中的messages表中。请记住,如果您在那时,还需要运行RAILS_ENV=production rake db:migrate将其添加到生产数据库中。