0

デバイス 2.1.0 を使用して、ページにモデル
を送信しようとしています。 したがって、私のルートには次のものがあります。new registrationPricingPlan

devise_scope :user do
    delete "/logout" => "devise/sessions#destroy"
    get "/login" => "devise/sessions#new"
    get "/signup/:plan" => "devise/registrations#new"
  end

そして、デバイス登録コントローラーをオーバーライドします。これをroutes.rbで機能させるには:

devise_for :users, :controllers => {:registrations => "registrations"}

Deviseのコントローラーをオーバーライドする実際の登録コントローラーには、次のものがあります。

class RegistrationsController < Devise::RegistrationsController
  view_paths = "app/views/devise"
  def new
    super
    @plan = PricingPlan.find_by_name(params[:plan])
  end

デフォルトのビューがまだdeviseに行くように....コントローラーの
私のnewビューでは、registrationこれを呼び出します:

<h3>You've chosen the <%= @plan.name %> plan.</h3>

そして、私はこのエラーを受け取ります:

undefined method `name' for nil:NilClass

また...私のPricingPlanモデルでは:

class PricingPlan < ActiveRecord::Base
  has_many :users

そして私のUserモデルでは:

class User < ActiveRecord::Base
  belongs_to :pricing_plan

私はレールでかなり新しいです。

4

2 に答える 2

1

何らかの理由で @plan が空です...

計画を見つけていることを確認するために、以下の行を変更してみてください...

@plan = PricingPlan.find_by_id(1)

もしそうなら、間違った引数で検索しようとしている可能性があります...データベースに列「計画」がありますか?

@plan = PricingPlan.find_by_name(params[:______]) 
于 2012-06-10T16:51:20.810 に答える
0

登録コントローラーでa を行ったときraise、 /signup/:planregistrations controllerを押したときに、 overodes from devises を押していないことに気付きましたregistration controller
私は理由を理解します:
私は自分のコントローラーを作ったので、スコープはもはやスコープを考案していません...

だからこれは間違っていました:

get "/signup/:plan" => "devise/registrations#new"

ただし、これは正しいです:

get "/signup/:plan" => "registrations#new"

したがって、ルートのその部分は次のようになります。

  devise_scope :user do
    delete "/logout" => "devise/sessions#destroy"
    get "/login" => "devise/sessions#new"
    get "/signup/:plan" => "registrations#new"
  end

コード内の他のすべては同じままでした。コントローラーをトレースさせてくれた@gabrielhiralに感謝します。

于 2012-06-11T02:07:16.847 に答える