0

seed.rbを使用して.txtファイルからロードしたクラブとアクティビティ(バンドまたは野球)のリストがあります。ビューにチェックボックスのリストを作成して、ユーザーが自分が参加しているアクティビティを確認できるようにしたい。アクティビティのリストの反復を作成するのに問題があり、「nil:NilClassの未定義のメソッド`each'」エラーが表示されます。私のモデルはアクティビティと呼ばれています。

私のコントローラーには@activities=Activity.allと

私の見解には<%@ activities.each do |a|があります %>

しかし、その行は機能しません。アクティビティモデルには、役立つ場合は:nameという文字列属性があります。誰かが私が試すことができるアイデアを持っていますか?ありがとう!

ルート。rb

CollegeConnection::Application.routes.draw do
  devise_for :users

  resources :quizzes
  resources :users
  resources :majors
  resources :activities


  root :to => "users#welcome"
 end

quiz controller:


class QuizzesController < ApplicationController
before_filter :authenticate_user!


# GET /quizzes
# GET /quizzes.json

def index
  @quizzes = Quiz.all

  respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @quizzes }
  end
end

# GET /quizzes/1
# GET /quizzes/1.json
def show
  @quiz = Quiz.find(params[:id])

  respond_to do |format|
  format.html # show.html.erb
  format.json { render json: @quiz }
  end
end

# GET /quizzes/new
# GET /quizzes/new.json
def new
  @quiz = Quiz.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @quiz }
  end
end

# GET /quizzes/1/edit
def edit
  @quiz = current_user.quizzes.build(params[:id])
end

# POST /quizzes
# POST /quizzes.json
def create
  @quiz = Quiz.new(params[:quiz])
  @quiz.userName=current_user.name
  @activities = Activity.all
  respond_to do |format|
    if @quiz.save
      format.html { redirect_to @quiz, notice: 'Thank You for Taking the Quiz!.' }
      format.json { render json: @quiz, status: :created, location: @quiz }
    else
      format.html { render action: "new" }
      format.json { render json: @quiz.errors, status: :unprocessable_entity }
    end
  end
end

# PUT /quizzes/1
# PUT /quizzes/1.json

def update
  @quiz = Quiz.find(params[:id])

  respond_to do |format|
    if @quiz.update_attributes(params[:quiz])
      format.html { redirect_to @quiz, notice: 'Quiz was successfully updated.' }
      format.json { head :ok }
    else
      format.html { render action: "edit" }
      format.json { render json: @quiz.errors, status: :unprocessable_entity }
    end
  end
end

# DELETE /quizzes/1
# DELETE /quizzes/1.json
def destroy
  @quiz = Quiz.find(params[:id])
  @quiz.destroy

  respond_to do |format|
    format.html { redirect_to quizzes_url }
    format.json { head :ok }
  end
end

終わり

_form.html.erbクイズビュー

<%= form_for(@quiz, html: {class: "nice"}) do |f| %>
  <% if @quiz.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@quiz.errors.count, "error") %> 
        prohibited this quiz from being saved:
      </h2>

    <ul>
      <% @quiz.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
    </div>
<% end %>

<div class="field">
  <%= f.label :q1, "Current/Possible Major" %><br />
  <%= f.collection_select(:q1, Major.all, :name, :name) %>
</div>
<div class="field">
  <%= f.label :q2, "Activities" %><br />
  <%= f.collection_select(:q2, Activity.all, :name, :name) %>
</div>


<% @activities.each do |a| %> 
<%= a.check_box :active %> 
<%= a.submit "Update" %> 
<% end %>


<div class="field">
  <%= f.label :q3 %><br />
  <%= f.text_area :q3, class: 'input-text' %>
</div> 

<div class="actions">
  <%= f.submit "Submit" %>
</div>

さて、私は部分的な解決策を見つけました:

<div class="field">
  <%= f.label :q2, "Activities" %><br />  
  <% for activity in Activity.find(:all) %>
    <div>
      <%= check_box_tag(:q2, activity.name) %> <%=activity.name %>
    </div>
  <% end %>
</div>

すべてのチェックボックスの横に名前が表示されますが、q2(質問2のクイズ属性)の回答として値が設定されていません。チェックボックスタグに問題があると思います。f.check_boxを試しましたが、どちらも機能しません。何か助けはありますか?

エラー:

NoMethodError in Quizzes#new

Showing /Users/Daniel/Documents/cis196/CollegeConnection/app/views/quizzes/_form.html.erb
where line #24 is raised

undefined method `merge' for "Debate\n":String
Extracted source (around line #24):

21:     <%= f.label :q2, "Activities" %><br />  
22:     <% for activity in Activity.find(:all) %>
23:     <div>
24:        <%= f.check_box(:q2, activity.name) %> <%=activity.name %>
25:     </div>
26:   <% end %>
27:   </div>
Trace of template inclusion: app/views/quizzes/new.html.erb

Rails.root: /Users/Daniel/Documents/cis196/CollegeConnection 

Application Trace | Framework Trace | Full Trace
app/views/quizzes/_form.html.erb:24:in `block (2 levels) in      _app_views_quizzes__form_html_erb__435461842904466959_70320063188680'

app / views / quizzes / _form.html.erb:22:in each' app/views/quizzes/_form.html.erb:22:inblock in _app_views_quizzes__form_html_erb__435461842904466959_70320063188680'app / views / quizzes / _form.html.erb:1:in _app_views_quizzes__form_html_erb__435461842904466959_70320063188680' app/views/quizzes/new.html.erb:6:in_app_views_quizzes_new_html_erb__735256988435リクエスト

パラメーター:

なしセッションダンプを表示

環境ダンプを表示

応答

ヘッダー:

なし

クイズモデル

Class Quiz < ActiveRecord::Base
belongs_to :user

validates :q1, :presence => true
validates :q2, :presence => true
validates :q3, :presence => true

serialize :q2

終わり

4

1 に答える 1

1

これが私が起こっていると思うことです。_formパーシャルは、作成ビューと編集ビューで共有されている可能性があるため、パーシャルです。_formパーシャルは、初期化される@activitiesに依存します。作成アクションでのみ初期化されています。次のようなものを試してください。

quizzes_controller.rb

QuizzesController < ApplicationController
  before_filter load, :only =>[:create, :edit]
  def load
    @activities = Activity.all
  end
end

その後、削除することができます

@activities = Activity.all

作成アクションから、@activitiesは作成アクションと編集アクションの両方で初期化されます。

アップデート:

check_box_tagは3つ(またはそれ以上)の引数を取ります。最初は要素のID、2番目は配信される値、THIRDはブール値であり、trueの場合にチェックボックスがオンになります。

したがって、モデルを投稿する必要があります。関連付けは、クイズの「has_many」アクティビティなどを実行します。

于 2012-05-01T22:05:21.200 に答える