0

まったく同じ構造のクイズがいくつかあるレールアプリを構築しています:

  • @quiz_bfまたはのような名前@quiz_bs
  • new.html.erbedit.html.erb各クイズのビュー
  • _quiz.html.erb各クイズの実際のクイズの質問を保存するパーシャル
  • 個別のクイズごとにモデルとコントローラー
  • 2 つの場所 (メイン ナビゲーションとユーザー プロファイル ページ) には、各クイズのnewビュー (またはedit、クイズを既に受けている場合は、erb if/else ステートメントによって決定されるビュー) へのリンクがあります。

私は最初のクイズを設定することに成功しましたが、Ruby を初めて使用するのでquiz_bs、クイズの単数バージョンに -s ( ) で終わる変数名を設定するという (ひどい) 間違いを犯しました。これは、Ruby の単数対複数の命名規則に大混乱をもたらしました。

現在、2 番目のクイズ ( quiz_bf) のコードをセットアップしていますがundefined method 'quiz_bfs' for #<User:0x007fb9a3247f98>、コントローラの新しいクイズの定義で no method エラーが発生しています。

これが私のコントローラーです:

class QuizBfController < ApplicationController
before_action :require_sign_in

def show
  @quiz_bf = QuizBf.find(params[:id])
end

def new
  @quiz_bf = current_user.quiz_bfs || current_user.build_quiz_bfs
end

def create
  @quiz_bf = QuizBf.new

  @quiz_bf.bf01 = params[:quiz_bfs][:bf01]
  @quiz_bf.bf02 = params[:quiz_bfs][:bf02]
  @quiz_bf.bf03 = params[:quiz_bfs][:bf03]
  @quiz_bf.bf04 = params[:quiz_bfs][:bf04]
  @quiz_bf.bf05 = params[:quiz_bfs][:bf05]
  @quiz_bf.bf06 = params[:quiz_bfs][:bf06]
  @quiz_bf.bf07 = params[:quiz_bfs][:bf07]
  @quiz_bf.bf08 = params[:quiz_bfs][:bf08]
  @quiz_bf.bf09 = params[:quiz_bfs][:bf09]
  @quiz_bf.bf10 = params[:quiz_bfs][:bf10]

  @quiz_bf.user = current_user

  if @quiz_bf.save
    flash[:notice] = "Quiz results saved successfully."
    redirect_to user_path(current_user)
  else
    flash[:alert] = "Sorry, your quiz results failed to save."
    redirect_to welcome_index_path
  end
  end

  def edit
    @quiz_bf = QuizBf.find(params[:id])
  end

  def update
  @quiz_bf = QuizBf.find(params[:id])

  @quiz_bf.assign_attributes(quiz_bfs_params)

  if @quiz_bf.save
    flash[:notice] = "Post was updated successfully."
    redirect_to user_path(current_user)
    else
    flash.now[:alert] = "There was an error saving the post. Please try again."
    redirect_to welcome_index_path
    end
    end

    private
    def quiz_bfs_params
    params.require(:quiz_bfs).permit(:bf01, :bf02, :bf03, :bf04, :bf05, :bf06, :bf07, :bf08, :bf09, :bf10)
    end

    end

これが私のモデルです(ユーザーhas_one :quiz_bf):

class QuizBf < ActiveRecord::Base
before_save :set_bfcode

def set_bfcode
  self.bfcode = "#{self.bf01}#{self.bf02}#{self.bf03}-#{self.bf04}#{self.bf05}#{self.bf06}-#{self.bf07}#{self.bf08}#{self.bf09}#{self.bf10}"
end

belongs_to :user
validates :user, presence: true
end

ここに私のユーザーモデルがあります:

class User < ActiveRecord::Base
before_save { self.email = email.downcase }

validates :name, length: { minimum: 1, maximum: 100 }, presence: true
validates :password, presence: true, length: { minimum: 6 }, unless: :password_digest
validates :password, length: { minimum: 6 }, allow_blank: true
validates :email,
        presence: true,
        uniqueness: { case_sensitive: false },
        length: { minimum: 3, maximum: 254 }

has_secure_password

has_one :quiz_bs
has_one :quiz_bf

終わり

これが私のクイズのパーシャルの密接な関係です。

<%= form_for @quiz_bf do |f| %>

...

<%= f.submit "Submit Answers" %>

私のnew見解からリンクする方法は次のとおりです。

<%= render partial: "quiz", locals: { url: quiz_bfs_path, method: :post } %>

そして私のedit見解:

<%= render "quiz", url: quiz_bf_path(@quiz_bf), method: :put  %>

そして(最後に)私のapplication見解からリンクする方法は次のとおりです。

          <% if current_user.quiz_bfs == nil? %>
             <%= link_to "Body Flexibility Quiz", quiz_bf_path %>
          <% else %>
             <%= link_to "Body Flexibility Quiz ✓", edit_quiz_bf_path(current_user.quiz_bfs) %>
          <% end %>

そして私のユーザーshowページ:

  <% if @user.quiz_bfs == nil %>
    <p><%= link_to "Test Your Body Flexibility", new_quiz_bf_path %></p>
  <% else %>
    <h3><%= @user.quiz_bfs.bfcode %></h3>
    <p><%= link_to "Retest Results", edit_quiz_bf_path(@user.quiz_bfs) %></p>
  <% end %>

このコードが で正常に機能したことはわかってquiz_bsいますが、rake ルート (以下に示す) でわかるように、私のばかげた変数名の複数形/単数形の問題により、実際に何が何と名付けられたのかを確認するのが難しくなりました。私よりも経験豊富なルビーの目をした人は、私が何を変える必要があるかを教えてくれますか?

        quiz_bs GET    /quiz_bs(.:format)             quiz_bs#index
                POST   /quiz_bs(.:format)             quiz_bs#create
     new_quiz_b GET    /quiz_bs/new(.:format)         quiz_bs#new
    edit_quiz_b GET    /quiz_bs/:id/edit(.:format)    quiz_bs#edit
         quiz_b GET    /quiz_bs/:id(.:format)         quiz_bs#show
                PATCH  /quiz_bs/:id(.:format)         quiz_bs#update
                PUT    /quiz_bs/:id(.:format)         quiz_bs#update
                DELETE /quiz_bs/:id(.:format)         quiz_bs#destroy
  quiz_bf_index GET    /quiz_bf(.:format)             quiz_bf#index
                POST   /quiz_bf(.:format)             quiz_bf#create
    new_quiz_bf GET    /quiz_bf/new(.:format)         quiz_bf#new
   edit_quiz_bf GET    /quiz_bf/:id/edit(.:format)    quiz_bf#edit
        quiz_bf GET    /quiz_bf/:id(.:format)         quiz_bf#show
                PATCH  /quiz_bf/:id(.:format)         quiz_bf#update
                PUT    /quiz_bf/:id(.:format)         quiz_bf#update
                DELETE /quiz_bf/:id(.:format)         quiz_bf#destroy
4

1 に答える 1

1

未定義のメソッド エラー

quiz_bfs未定義のメソッドの問題は、モデルが has_one アソシエーションのみを定義しているのに対し、has_many アソシエーションがあることを想定している呼び出しが複数呼び出し ( ) であることに関係している可能性があります。

has_one :quiz_bs
has_one :quiz_bf

a) の使用がquiz_bfsタイプミスであり、 である必要がある、b) has_one が正しくない、または c)に値を代入するために をquiz_bf呼び出す必要がまったくない、のいずれかです。詳細がわからないとわかりにくいですが、削除するだけで良さそうです。current_user.quiz_bfs@quiz_bfcurrent_user.quiz_bfs

ルートのボーナス

この質問ではありませんが、具体的には、「s」で終わるリソースが複数形として扱われることの苦痛について言及しました。まだ見ていない場合は、quiz_bsルートに適切な名前を付けることができます。これを行うには、config/routes.rbファイルで次のフォームを使用できます。

resources :quiz_bs, as: :quiz_bs

これにより、必要なルート ヘルパー名が得られるはずです。これについては、 Rails Routing from the Outside InのOverriding Named Helpersセクションで詳しく読むことができます。

controller にも名前を付けることができます。これを行うには、リソースのルート定義でオーバーライドをQuizBsController使用できます。controller:これを試して、正しいコントローラーが得られるかどうかを確認してください。

resources :quiz_bs, controller: 'quiz_bs'

両方のルート メソッドをいつでも組み合わせて、次のようなものを使用できます。

resources :quiz_bs, controller: 'quiz_bs', as: :quiz_bs

詳細と使用方法の詳細については、 Rails Routing from the Outside InSpecifying a Controller to Useセクションを参照してください。

于 2016-05-08T07:43:20.780 に答える