2

Rails 3.2.13 と Ruby 1.9.3p392 を使用して、Ruby on Rails を初めて使用しています。アプリで使用するエンジンを構築しようとしていますが、これが混乱の原因になっている可能性があります。

エンジン名は sales_app です。大量のデータを sales_app/sales#create に投稿してセールを作成するページがあります。sales コントローラーの create アクション内で、少しデータ処理を行い、Sale オブジェクトのインスタンス化を試みます。モデルからオブジェクトを作成する代わりに、呼び出していることさえ知らなかった削除メソッドに対して NoMethodError 例外が発生します。助けてください。

関連する詳細は次のとおりです。私の販売/新しいページは、次のパラメーターを sales#create に送信します。

{"sale"=>{"name"=>"Test",
 "desc"=>"This is a test",
 "start_date"=>"05/30/2013",
 "end_date"=>"05/31/2013",
 "start_time"=>"07:00",
 "end_time"=>"08:00",
 "products"=>""},
 "create"=>"Create Sale"}

Sales コントローラーには、その create アクション用に次のものがあります。

def create
  if params[:create] == "Create Sale"
    # process the data - add a start and end to params
    #format = "%m/%d/%Y %H:%M:%S"
    params[:sale][:start] = DateTime.strptime("#{params[:sale][:start_date]} #{params[:sale][:start_time]}:00", '%m/%d/%Y %H:%M:%S')
    params[:sale][:end] = DateTime.strptime("#{params[:sale][:end_date]} #{params[:sale][:end_time]}:00", '%m/%d/%Y %H:%M:%S')
    @sale = Sale.new(:name => params[:sale][:name], :desc => params[:sale][:desc], :start => params[:sale][:start], :end => params[:sale][:end])
    if @sale.save
      redirect_to @sale
    else
      render 'new'
    end
  else
    render '/sales_app/static_pages/home'
  end      
end

日付のものは、日付と時刻を単一の日時に変換することを目的としており、それが機能していると思います。Sale モデル自体は次のようになります (一部がこのようになっている理由はわかりません)。

module SalesApp
  class Sale < ActiveRecord::Base
    attr_accessible :desc, :end, :name, :start
    def initialize(attributes = {})
      @name = attributes[:name]
      @desc = attributes[:desc]
      @start = attributes[:start]
      @end = attributes[:end]
    end

    validates :name, presence: true, length: { maximum: 255 }
    validates :desc, presence: true, length: { maximum: 65536 }
    validates :start, presence: true
    validates :end, presence: true
  end

end

モデルを生成し、rake db:migrate を実行しました。私のスキーマは次のようになります。

ActiveRecord::Schema.define(:version => 20130527160623) do

  create_table "sales", :force => true do |t|
    t.string   "name"
    t.text     "desc"
    t.datetime "start"
    t.datetime "end"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

end

スキーマ ファイルはメイン アプリにありますが、販売モデル ファイルはエンジンにあります。うーん。

ですから、もっとうまくやれることはたくさんあるはずです。具体的には、Sale オブジェクトを作成できない理由、またはそれを作成するために何をする必要があるか、または少なくとも何らかの未定義の削除メソッドが呼び出されている理由を知りたいと思っています。どんな援助でも大歓迎です。ありがとう!

EDIT Rake Routes は以下を示します:

sales_app_static_pages_home GET    /sales_app/static_pages/home(.:format) sales_app/static_pages#home
sales_app_static_pages_help GET    /sales_app/static_pages/help(.:format) sales_app/static_pages#help
            sales_app_sales GET    /sales_app/sales(.:format)             sales_app/sales#index
                            POST   /sales_app/sales(.:format)             sales_app/sales#create
new_sales_app_sale          GET    /sales_app/sales/new(.:format)         sales_app/sales#new
edit_sales_app_sale         GET    /sales_app/sales/:id/edit(.:format)    sales_app/sales#edit
sales_app_sale              GET    /sales_app/sales/:id(.:format)         sales_app/sales#show
                            PUT    /sales_app/sales/:id(.:format)         sales_app/sales#update
                            DELETE /sales_app/sales/:id(.:format)         sales_app/sales#destroy
sales_app_root        /sales_app(.:format)                   sales_app/static_pages#home
4

4 に答える 4

5

これはかなり古い質問であり、この回答は元の投稿に直接回答するものではありませんが、他の誰かが「未定義のメソッド削除」エラーに出くわし、何が起こっているのか疑問に思う場合は、メソッド名に関係している可能性があります.

具体的には、「initialize」というメソッドはRubyと同様にRailsでも予約されているようです。したがって、データをモデルの 1 つにプラグインするためのメソッドを作成している場合 (before_validation :initialize など)、未定義のメソッド削除エラーが発生します。メソッドに別の名前を付けると (例: before_validation :init_my_model)、エラーはなくなります。

@Deranger私は、initializeメソッドが物事をいじっていたのではないかと思います。

于 2014-01-25T00:39:40.700 に答える
0

見る

if @sale.save
  redirect_to @sale 
else
  render 'new'
end

redirect_to @sale、@sale はメソッド delete を取得します

への変更

if @sale.save
  redirect_to sales_app_sales_path # or whatever do you want
else
  render 'new'
end
于 2013-05-29T21:46:02.537 に答える
0

価値があるのは、私が抱えていた問題を修正したことであり、途中で問題が解決したかどうかはわかりません. ここに私がしたいくつかのことがあります。

1) アプリの routes.rb ファイルで、ルートを「マウント」する代わりに名前空間を設定しました。これを追加して変更しました: mount [appname]::Engine => "/[root directory]", :as => "namespaced".

2) 販売モデルの ":end" および ":start" 属性を ":end" および ":starting" に変更しました。これは、":end" が使用するのが非常に不適切な用語のように思えたからです。移行をロールバックし、移行を編集し、rake db:migrate を実行しました。

3) セールス コントローラーで、Sale.new(blahblahblah) を ::Sale.new(blahblahblah) に変更しました。これが必要かどうかはわかりません。私は今、何かに触れるのが怖いです。

4) セールス コントローラーで、redirect_to @sale を残しましたが、期待どおりの動作をしているようです。render 'new' を redirect_to 'some/page/here' に変更しました。

5) エンジンから販売モデルを削除し、アプリにコピーだけを残しました (以前は、何らかの理由でエンジンとアプリに販売モデルがありました)。さらに、「def initialize(attributes)」メソッドをすべてコメントアウトしました。それがそこで何をしていたのか、それが必要かどうかさえわからない...

途中で他の変更があった可能性があります。どの変更が実際に問題を修正したのか、それとも複数の要因が組み合わさったものなのか、私にはよくわかりません。しかし、モデル オブジェクトを作成して操作できるようになりました。

于 2013-05-30T23:08:13.513 に答える