Ruby on rails 未定义的方法`资源类型';对于#<;引脚:0x00007fbb13c4aa10>;你是说?还原文本

Ruby on rails 未定义的方法`资源类型';对于#<;引脚:0x00007fbb13c4aa10>;你是说?还原文本,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正试图破坏我的rails应用程序,我被卡住了。表单显示在/pins/new,但在点击submit后,我遇到了此错误 如果需要更多文件来解决此问题,请告诉我。这是说有一个未定义的方法'resource_type',但我没有这个名称的方法,这是我感到困惑的地方。这件事已经拖了好几天了。我在谷歌上搜索了很多,并尝试了各种各样的解决方案,但运气不佳。请帮忙。谢谢你 获取错误 “资源类型”的未定义方法,您的意思是?还原文本 Github可在以下位置找到: 最后一次提交是在添加用于创建新pin的get/p

我正试图破坏我的rails应用程序,我被卡住了。表单显示在/pins/new,但在点击submit后,我遇到了此错误

如果需要更多文件来解决此问题,请告诉我。这是说有一个未定义的方法'resource_type',但我没有这个名称的方法,这是我感到困惑的地方。这件事已经拖了好几天了。我在谷歌上搜索了很多,并尝试了各种各样的解决方案,但运气不佳。请帮忙。谢谢你

获取错误

“资源类型”的未定义方法,您的意思是?还原文本

Github可在以下位置找到: 最后一次提交是在添加用于创建新pin的get/post路由之前

指向#CREATE方法中的pins_controller.rb第21行

class PinsController < ApplicationController

  def index
    @pins = Pin.all
  end

  def show
    @pin = Pin.find(params[:id])
  end

  def show_by_name
     @pin = Pin.find_by_slug(params[:slug])
     render :show
  end

  def new
     @pin = Pin.new
  end

  def create
    @pin = Pin.create(pin_params)
    redirect :show
  end

  private
  def pin_params
    params.require(:pin).permit(:title, :url, :slug, :text, :category_id)
  end
end
new.html.erb

<%= form_for @pin do |f| %>
    <div class="form-group">
        <label for="pin_title">Title</label>
        <%= f.text_field(:title, class: "form-control") %>
    </div>
    <div class="form-group">
        <label for="pin_url">URL</label>
        <%= f.url_field(:url, class: "form-control") %>
    </div>
    <div class="form-group">
        <label for="pin_text">Description</label>
        <%= f.text_area(:text, class: "form-control") %>
    </div>
    <div class="form-group">
        <label for="pin_category_id">Category</label>
        <%= f.collection_select(:category_id, Category.all, :id, :name, class: "form-control") %>
    </div>
    <div class="form-group">
        <%= f.submit(class: "btn btn-default")%>
    </div>
<% end %>

您有一个引用
资源类型
的验证:

class Pin < ActiveRecord::Base
  validates_presence_of :title, :url, :slug, :text, :resource_type # its right here!
  validates_uniqueness_of :slug
  belongs_to :category
end
class Pin
如果您真的想拥有它,那么您需要通过迁移将该列添加到数据库中

这不是创建资源的方式

class PinsController < ApplicationController
  # ...

  # POST /pins
  def create
    @pin = Pin.new(pin_params)
    if @pin.save
      redirect_to @pin
    else
      render :new
    end 
  end

  # ...
end
class PinsController
您能否检查pin型号或某些相关型号中是否使用了资源类型字段。此外,您可以添加管脚型号代码和错误堆栈。管脚型号中使用了资源类型字段。我添加了pin和类别模型。我还添加了create_category迁移文件。我希望通过错误堆栈,您指的是完整的跟踪。在我的create_category迁移中,我的属性category_id=resource_type。这次迁移是由我注册的班级给我的。在尝试了新给出的create方法之后,虽然它在没有错误的情况下工作,但它无法创建pin的新实例。行“@pin=pin.new”已经在“new”方法中执行。你所说的I属性category\u id=resource\u type是什么意思?您需要检查数据库中是否有该列。“行“@pin=pin.new”已在“new”方法中执行。”。这完全是错误的。当用户请求
/pins/new
时,将执行新方法。当您发布表单时,这是一个全新的请求,并且前一个请求中的变量已消失。在create_category迁移文件中,我循环遍历每个pin并为其提供一个category_id。在rails控制台中,在创建了一个包含零数据的pin后,显示了此#。post请求不应该通过请求发送表单中的数据吗?我使用Sinatra完成了这项工作,没有任何问题。您是否尝试过编写测试,使用有效和无效属性发布到
/pins
?这是创建资源的公认方法,如果你不相信我的话,它会被固定在脚手架生成器中。这里的问题可能是糟糕的方法。
class Category < ActiveRecord::Base
    has_many :pins
end
class CreateCategories < ActiveRecord::Migration[4.2]
  def change
    create_table :categories do |t|
      t.string :name
    end

    add_column :pins, :category_id, :integer, references: :categories
    add_index :pins, :category_id

    if Category.all.empty?
      Category.create(name: "ruby")
      Category.create(name: "rails")
      Category.create(name: "unknown")
    end

    unknown_category = Category.find_by_name("unknown")
    pins = Pin.where("category_id is null")

    pins.each do |pin|
      category = Category.find_by_name(pin.resource_type)
      if category.present?
        pin.category_id = category.id
      else
        pin.category_id = unknown_category.id
      end
      pin.save
    end

    if Pin.where("category_id is null").empty?
      remove_column :pins, :resource_type
      puts "MIGRATION SUCCESSFUL!"
      puts "All your data has been migrated successfully."      
    else
      puts "ERROR! Something went wrong - not all pins have been assigned a category Id."
    end
  end
end

activemodel (5.2.2) lib/active_model/attribute_methods.rb:430:in `method_missing'
activemodel (5.2.2) lib/active_model/validator.rb:150:in `block in validate'
activemodel (5.2.2) lib/active_model/validator.rb:149:in `each'
activemodel (5.2.2) lib/active_model/validator.rb:149:in `validate'
activesupport (5.2.2) lib/active_support/callbacks.rb:426:in `block in make_lambda'
activesupport (5.2.2) lib/active_support/callbacks.rb:198:in `block (2 levels) in halting'
activesupport (5.2.2) lib/active_support/callbacks.rb:606:in `block (2 levels) in default_terminator'
activesupport (5.2.2) lib/active_support/callbacks.rb:605:in `catch'
activesupport (5.2.2) lib/active_support/callbacks.rb:605:in `block in default_terminator'
activesupport (5.2.2) lib/active_support/callbacks.rb:199:in `block in halting'
activesupport (5.2.2) lib/active_support/callbacks.rb:513:in `block in invoke_before'
activesupport (5.2.2) lib/active_support/callbacks.rb:513:in `each'
activesupport (5.2.2) lib/active_support/callbacks.rb:513:in `invoke_before'
activesupport (5.2.2) lib/active_support/callbacks.rb:131:in `run_callbacks'
activesupport (5.2.2) lib/active_support/callbacks.rb:816:in `_run_validate_callbacks'
activemodel (5.2.2) lib/active_model/validations.rb:409:in `run_validations!'
activemodel (5.2.2) lib/active_model/validations/callbacks.rb:118:in `block in run_validations!'
activesupport (5.2.2) lib/active_support/callbacks.rb:98:in `run_callbacks'
activesupport (5.2.2) lib/active_support/callbacks.rb:816:in `_run_validation_callbacks'
activemodel (5.2.2) lib/active_model/validations/callbacks.rb:118:in `run_validations!'
activemodel (5.2.2) lib/active_model/validations.rb:339:in `valid?'
activerecord (5.2.2) lib/active_record/validations.rb:67:in `valid?'
activerecord (5.2.2) lib/active_record/validations.rb:84:in `perform_validations'
activerecord (5.2.2) lib/active_record/validations.rb:46:in `save'
activerecord (5.2.2) lib/active_record/transactions.rb:310:in `block (2 levels) in save'
activerecord (5.2.2) lib/active_record/transactions.rb:387:in `block in with_transaction_returning_status'
activerecord (5.2.2) lib/active_record/connection_adapters/abstract/database_statements.rb:259:in `block in transaction'
activerecord (5.2.2) lib/active_record/connection_adapters/abstract/transaction.rb:239:in `block in within_new_transaction'
/Users/dl/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
activerecord (5.2.2) lib/active_record/connection_adapters/abstract/transaction.rb:236:in `within_new_transaction'
activerecord (5.2.2) lib/active_record/connection_adapters/abstract/database_statements.rb:259:in `transaction'
activerecord (5.2.2) lib/active_record/transactions.rb:212:in `transaction'
activerecord (5.2.2) lib/active_record/transactions.rb:385:in `with_transaction_returning_status'
activerecord (5.2.2) lib/active_record/transactions.rb:310:in `block in save'
activerecord (5.2.2) lib/active_record/transactions.rb:325:in `rollback_active_record_state!'
activerecord (5.2.2) lib/active_record/transactions.rb:309:in `save'
activerecord (5.2.2) lib/active_record/suppressor.rb:44:in `save'
activerecord (5.2.2) lib/active_record/persistence.rb:36:in `create'
app/controllers/pins_controller.rb:21:in `create'
actionpack (5.2.2) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (5.2.2) lib/abstract_controller/base.rb:194:in `process_action'
actionpack (5.2.2) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (5.2.2) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport (5.2.2) lib/active_support/callbacks.rb:132:in `run_callbacks'
actionpack (5.2.2) lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack (5.2.2) lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack (5.2.2) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
activesupport (5.2.2) lib/active_support/notifications.rb:168:in `block in instrument'
activesupport (5.2.2) lib/active_support/notifications/instrumenter.rb:23:in `instrument'
activesupport (5.2.2) lib/active_support/notifications.rb:168:in `instrument'
actionpack (5.2.2) lib/action_controller/metal/instrumentation.rb:32:in `process_action'
actionpack (5.2.2) lib/action_controller/metal/params_wrapper.rb:256:in `process_action'
activerecord (5.2.2) lib/active_record/railties/controller_runtime.rb:24:in `process_action'
actionpack (5.2.2) lib/abstract_controller/base.rb:134:in `process'
actionview (5.2.2) lib/action_view/rendering.rb:32:in `process'
actionpack (5.2.2) lib/action_controller/metal.rb:191:in `dispatch'
actionpack (5.2.2) lib/action_controller/metal.rb:252:in `dispatch'
actionpack (5.2.2) lib/action_dispatch/routing/route_set.rb:52:in `dispatch'
actionpack (5.2.2) lib/action_dispatch/routing/route_set.rb:34:in `serve'
actionpack (5.2.2) lib/action_dispatch/journey/router.rb:52:in `block in serve'
actionpack (5.2.2) lib/action_dispatch/journey/router.rb:35:in `each'
actionpack (5.2.2) lib/action_dispatch/journey/router.rb:35:in `serve'
actionpack (5.2.2) lib/action_dispatch/routing/route_set.rb:840:in `call'
rack (2.2.2) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.2.2) lib/rack/etag.rb:27:in `call'
rack (2.2.2) lib/rack/conditional_get.rb:40:in `call'
rack (2.2.2) lib/rack/head.rb:12:in `call'
actionpack (5.2.2) lib/action_dispatch/http/content_security_policy.rb:18:in `call'
rack (2.2.2) lib/rack/session/abstract/id.rb:266:in `context'
rack (2.2.2) lib/rack/session/abstract/id.rb:260:in `call'
actionpack (5.2.2) lib/action_dispatch/middleware/cookies.rb:670:in `call'
activerecord (5.2.2) lib/active_record/migration.rb:559:in `call'
actionpack (5.2.2) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
activesupport (5.2.2) lib/active_support/callbacks.rb:98:in `run_callbacks'
actionpack (5.2.2) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack (5.2.2) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (5.2.2) lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call'
web-console (3.7.0) lib/web_console/middleware.rb:135:in `call_app'
web-console (3.7.0) lib/web_console/middleware.rb:30:in `block in call'
web-console (3.7.0) lib/web_console/middleware.rb:20:in `catch'
web-console (3.7.0) lib/web_console/middleware.rb:20:in `call'
actionpack (5.2.2) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
railties (5.2.2) lib/rails/rack/logger.rb:38:in `call_app'
railties (5.2.2) lib/rails/rack/logger.rb:26:in `block in call'
activesupport (5.2.2) lib/active_support/tagged_logging.rb:71:in `block in tagged'
activesupport (5.2.2) lib/active_support/tagged_logging.rb:28:in `tagged'
activesupport (5.2.2) lib/active_support/tagged_logging.rb:71:in `tagged'
railties (5.2.2) lib/rails/rack/logger.rb:26:in `call'
sprockets-rails (3.2.1) lib/sprockets/rails/quiet_assets.rb:13:in `call'
actionpack (5.2.2) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
actionpack (5.2.2) lib/action_dispatch/middleware/request_id.rb:27:in `call'
rack (2.2.2) lib/rack/method_override.rb:24:in `call'
rack (2.2.2) lib/rack/runtime.rb:22:in `call'
activesupport (5.2.2) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
actionpack (5.2.2) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (5.2.2) lib/action_dispatch/middleware/static.rb:127:in `call'
rack (2.2.2) lib/rack/sendfile.rb:110:in `call'
railties (5.2.2) lib/rails/engine.rb:524:in `call'
puma (4.3.3) lib/puma/configuration.rb:228:in `call'
puma (4.3.3) lib/puma/server.rb:682:in `handle_request'
puma (4.3.3) lib/puma/server.rb:472:in `process_client'
puma (4.3.3) lib/puma/server.rb:328:in `block in run'
puma (4.3.3) lib/puma/thread_pool.rb:134:in `block in spawn_thread'
class Pin < ActiveRecord::Base
  validates_presence_of :title, :url, :slug, :text, :resource_type # its right here!
  validates_uniqueness_of :slug
  belongs_to :category
end
class PinsController < ApplicationController
  # ...

  # POST /pins
  def create
    @pin = Pin.new(pin_params)
    if @pin.save
      redirect_to @pin
    else
      render :new
    end 
  end

  # ...
end