首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当方法存在时,如何修正“未定义的方法错误”?

当方法存在时,如何修正“未定义的方法错误”?
EN

Stack Overflow用户
提问于 2019-09-12 10:13:13
回答 3查看 499关注 0票数 0

我对Rails还很陌生,而且我也收到了这样的错误:

代码语言:javascript
复制
ActionView::Template::Error (undefined method `comment' for #<Contact:0x000000001057cac8>

我在网上查看过很多关于has_many的帖子,但我不认为这是我的错,因为我并不想创建一个评论帖子。

我的contacts_controller.rb:

代码语言:javascript
复制
class ContactsController < ApplicationController
  def new
    @contact = Contact.new
  end

  def create
    @contact = Contact.new(contact_params)

    if @contact.save
      name = params[:contact][:name]
      email = params[:contact][:email]
      body = params[:contact][:body]

      ContactMailer.contact_email(name, email, body).deliver

      flash[:success] = "Message sent."
      redirect_to new_contact_path
    else
      flash[:danger] = "Message not sent."
      redirect_to new_contact_path
    end
  end

  private

  def contact_params
    params.require(:contact).permit(:name, :email, :comment)
  end
end

我的联系人表格:

代码语言:javascript
复制
<div class="row">
  <%= form_for @contact do |f| %>
    <div class="col-md-4 col-md-offset-4">
      <div class="well">
        <div class="form-group">
          <%= f.label :name %>
          <%= f.text_field :name, class: "form-control" %>
        </div>

        <div class="form-group">
          <%= f.label :email %>
          <%= f.email_field :email, class: 'form-control' %>
        </div>

        <div class="form-group">
          <%= f.label :comment %>
          <%= f.text_area :comment, class: 'form-control' %>
        </div>

        <%= f.submit 'Submit', class: "btn btn-success btn-lg" %>
      </div>
    </div>

  <% end %>
</div>

我的模型,contact.rb:

代码语言:javascript
复制
class Contact < ActiveRecord::Base
  validates :name, presence: true
  validates :email, presence: true
  validates :comment, presence: true
end

我的数据库资料:

代码语言:javascript
复制
class CreateContacts < ActiveRecord::Migration[6.0]
  def change
    create_table :contacts do |t|
      t.string :name
      t.string :email
      t.text :comment

      t.timestamps
    end
  end
end

我使用Heroku管理mt应用程序,这是我运行rake db:migrate时的输出

代码语言:javascript
复制
DEPRECATION WARNING: Including LoggerSilence is deprecated and will be removed in Rails 6.1. Please use `ActiveSupport::LoggerSilence` instead (called from <top (required)> at /app/config/application.rb:7)
   (1.1ms)  SELECT pg_try_advisory_lock(1634294230270099020)
   (1.5ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
  ActiveRecord::InternalMetadata Load (1.6ms)  SELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1 LIMIT $2  [["key", "environment"], ["LIMIT", 1]]
   (1.2ms)  SELECT pg_advisory_unlock(1634294230270099020)

而且,这在我的本地主机上运行得很好,但对Heroku却不起作用。是Heroku给了我这个错误,我不知道为什么。

我尝试过的内容(请记住,我是RoR新手):

  1. 确保在本地主机上运行的相同版本是我推给Heroku的版本。
  2. 确保这不是我的路线上的问题。
  3. 重置数据库。
  4. 确保拼写一致。

我从Heroku日志中得到的错误:

代码语言:javascript
复制
2019-09-12T11:05:54.009358+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c] Completed 500 Internal Server Error in 226ms (ActiveRecord: 32.0ms | Allocations: 15274)
2019-09-12T11:05:54.011555+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c]
2019-09-12T11:05:54.011558+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c] ActionView::Template::Error (undefined method `comment' for #<Contact:0x000055682aab6110>
2019-09-12T11:05:54.011561+00:00 app[web.1]: Did you mean?  comments
2019-09-12T11:05:54.011563+00:00 app[web.1]: comments=
2019-09-12T11:05:54.011565+00:00 app[web.1]: comments?):
2019-09-12T11:05:54.011567+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c]     14:
2019-09-12T11:05:54.011570+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c]     15:         <div class="form-group">
2019-09-12T11:05:54.011572+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c]     16:           <%= f.label :comment %>
2019-09-12T11:05:54.011575+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c]     17:           <%= f.text_area :comment, class: 'form-control' %>
2019-09-12T11:05:54.011577+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c]     18:         </div>
2019-09-12T11:05:54.011579+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c]     19:
2019-09-12T11:05:54.011581+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c]     20:         <%= f.submit 'Submit', class: "btn btn-dark btn-block" %>
2019-09-12T11:05:54.011583+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c]
2019-09-12T11:05:54.011586+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c] app/views/contacts/new.html.erb:17
2019-09-12T11:05:54.011588+00:00 app[web.1]: [a382e524-adf1-462b-bff6-bd6cba881a7c] app/views/contacts/new.html.erb:2
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-12 11:03:43

你有列重命名的问题。不建议重置数据库,因为:

  • 其他环境或人员已经运行了旧的迁移,如果使用当前的方法,则必须通知每个人对每个环境都这样做(本例中为heroku)。
  • 通过重置数据库,您将丢失数据,我们可能会这样做,用于开发或测试,而不是生产数据。

您应该做的是创建另一个迁移文件,以便重命名该列,因此在拉动更改时,Rails将检测到新文件,并要求您运行rake db:migrate并解决问题。

代码语言:javascript
复制
def up
  # rename_column :contacts, :old_column, :new_column
  rename_column :contacts, :comments, :comment
end
票数 0
EN

Stack Overflow用户

发布于 2019-09-12 10:53:27

此代码中没有has_many关联。只有文本字段可供注释。如果使用comment而不是comments,则不会出现错误。

在主计长:

代码语言:javascript
复制
def contact_params
  params.require(:contact).permit(:name, :email, :comment)
end

和看法:

代码语言:javascript
复制
<div class="form-group">
  <%= f.label :comment %>
  <%= f.text_area :comment, class: 'form-control' %>
</div>

如果您想创建一个has_many关联,请查看rails指南:多协会

票数 1
EN

Stack Overflow用户

发布于 2019-09-12 10:53:47

我认为您的属性(列)名称是“注释”,您正在尝试传递“注释”。

所以应该是

控制器变化

代码语言:javascript
复制
def contact_params
    params.require(:contact).permit(:name, :email, :comment)
  end

意见的改变

代码语言:javascript
复制
<div class="form-group">
     <%= f.label :comments %>
     <%= f.text_area :comment, class: 'form-control' %>
 </div>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57904513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档