0

Meine Formulare funktionieren gut, aber ich bekomme immer undefined method empty? for nil:NilClass auf meine Auswahl-Tags, wenn ich Formular-Validierungen hinzufügen. Ich habe festgestellt, dass die Tatsache, dass ich Controller-Variablen in die select-Funktion auf dem Formular setze, das Problem verursacht.Validate select-Tag, das eine Controller-Variable verwendet

Ich habe eine lange Reihe von Optionen für die Select-Tags, obwohl ich weiß, es würde funktionieren, wenn ich nur die Arrays in der Select-Funktion einfügen möchte ich einen Weg finden, es so sauber zu halten, wie ich es jetzt habe

Hier ist mein Controller

class MembersController < ApplicationController 

    before_action :find_member, only: [:edit, :update, :delete, :destroy] 
    before_action :form_vars, only: [:new, :edit, :executives] 

    def find_member 
    @members = Member.find(params[:id]) 
    end 

    ... 

    def new 
    @members = Member.new 
    end 

    def create 
    @members = Member.new(members_params) #the new Members entry is recreated through the strong params method 
    @members.is_executive = true #Remove for members feature 
    if @members.save #if the entry saves 
     redirect_to({ action: 'executives' }, notice: @members.first_name + ' ' + @members.last_name + ' has been created!') #show all of the present entries 
    else 
     render({ action: 'new' }) #redisplay the create an entry page 
    end 
    end 
end 

Hier ist meine Form

<div class="forms"> 
    <%= form_for(@members) do |member| %> 
     <small>* = Required</small> 
    <label>First Name*</label><br> 
    <%= member.text_field :first_name %><br> 
    <label>Last Name*</label><br> 
    <%= member.text_field :last_name %><br> 
    <label>LinkedIn Profile Address</label><br> 
    <%= member.url_field :linkedinurl %><br> 
     <label>Photo*</label><br> 
     <%= member.file_field :avatar %><br> 
    <%= member.label 'Major*' %><br> 
    <%= member.select(:major, @major, selected: @members.major, prompt: 'Select Major') %><br> 
    <label>E-Mail*</label><br> 
    <%= member.text_field :email %><br> 
    <label>Graduation Date</label><br> 
    <%= member.select(:graduation_date, [1], selected: @members.graduation_date, prompt: 'Month') %> 
     <%= member.select(:graduation_date, Date.today.year..Date.today.year+5, prompt: 'Year') %><br> 
    <!-- <%= member.label(:is_executive, "Is this member an executive?") %> 
    <%= member.check_box(:is_executive) %></br> --> 
    <label>Executive Position*</label><br> 
    <%= member.select(:executive_position, @executive, selected: @members.executive_position, prompt: 'Select Position') %><br> 
     <%= member.submit %> 
     <b><%= link_to "Cancel", '/members/executives'%></b> 
    <% end %> 
</div> 

Meine select-Tag Optionen in der Anwendungssteuerung erklärt werden, da ich das gleiche sel bin mit in mehreren Formen ect Tag auf anderen Modellen

class ApplicationController < ActionController::Base 

... 
    def form_vars 
     @majors = ['Accounting', 'Africana Studies', 'Anthropology', 'Architecture', 'Art', 'Art History', 'Athletic Training', 'Biology', 'Business Administration', 'Chemistry', 'Child and Family Development', 'Civil Engineering', 'Civil Engineering Technology', 'Computer Science', 'Computer Engineering', 'Construction Management', 'Criminal Justice', 'Dance', 'Earth and Environmental Sciences', 'Economics', 'Electrical Engineering', 'Electrical Engineering Technology', 'Elementary Education', 'English', 'Environmental Studies', 'Exercise Science', 'Finance', 'Fire Safety Engineering Technology', 'French', 'Geography', 'Geology', 'German', 'History', 'International Business', 'International Studies', 'Japanese', 'Latin American Studies', 'Management', 'Management Information Systems', 'Marketing', 'Mathematics', 'Mathematics for Business', 'Mechanical Engineering', 'Mechanical Engineering Technology', 'Meteorology', 'Middle Grades Education', 'Music', 'Neurodiagnostics and Sleep Science', 'Nursing', 'Ops & Supply Chain Management', 'Pre-Law', 'Philosophy', 'Physics', 'Political Science', 'Psychology', 'Public Health', 'Religious Studies', 'Respiratory Therapy', 'Social Work', 'Sociology', 'Spanish', 'Special Education', 'Systems Engineering', 'Theatre'] 
     @executive = ['President', 'Vice President', 'Treasurer', 'Secretary', 'Strategic Advisor', 'Director of Strategic Partnerships', 'Director of Programs', 'Director of Public Relations', 'Director of Publications', 'Director of Community Service', 'Director of Fundraising', 'Historian', 'Digital Administrator'] 
     @grad_month = ['May', 'December'] 
    end 
end 

Was ist der beste Weg, dies zu tun, damit ich das Array aus meiner Formulardatei halten können, aber arbeiten Validierungen haben? Ich bin neu bei Rails, daher sind auch andere Best-Practice-Tipps willkommen. Danke!

Antwort

0

Validierungen sind der Teil von ActiveRecord. Also, für Validierungen arbeiten Sie alle benötigten Werte in das Modell hinzufügen können wie folgt:

class Member < ActiveRecord::Base 
    MAJORS = ['Accounting', 'Africana Studies', 'Anthropology', 'Architecture', 'Art', ...] 
    EXECUTIVES = ['President', 'Vice President', 'Treasurer', 'Secretary', ...] 
    GRAD_MONTH = ['May', 'December'] 

    validates :major, inclusion: { in: MAJORS, allow_blank: false } 
    validates :executive_position, inclusion: { in: EXECUTIVES, allow_blank: false } 
    validates :graduation_date, inclusion: { in: GRAD_MONTH, allow_blank: false } 
end 

Dann in Ihrer Form:

<%= f.select(:executive_position, Member::EXECUTIVES, selected: @members.executive_position, prompt: 'Select Position') %> 
# ... 
<%= member.select(:graduation_date, Members::GRAD_MONTH, selected: @members.graduation_date, prompt: 'Month') %> 
# ... 
<%= member.select(:major, Member::MAJORS, selected: @members.major, prompt: 'Select Major') %><br> 

Hier ist die documentation über Inklusion Validierung.

Mit dieser Approcah müssen Sie keine Werte in ApplicationController definieren.

Hoffnung, die helfen wird.