Я новичок в Rails. Я пытаюсь создать приложение, в котором учащиеся могут войти в систему и зарегистрироваться на экзамене. У меня есть следующие модели и контроллеры, которые связаны с тем:Как отправить params при использовании данных из других моделей, чтобы заполнить форму в Rails
Тема имеет следующие столбцы:
t.string "name"
t.integer "ects"
t.integer "year"
t.integer "professor_id"
Его отношения с экзамена: has_one: экзаменационные Его отношения с профессором:
belongs_to: профессор
профессор имеет следующие столбцы:
t.string "first_name"
t.string "last_name"
t.string "title"
Его отношения с экзаменом: has_many: экзамены Его отношения с темой: has_many: предметы
экзамен имеет следующие столбцы:
t.date "start_date"
t.string "department"
t.integer "professor_id"
t.integer "subject_id"
Его отношения с предмета: belongs_to: Тема Его отношения с профессором: BELONGS_TO: профессор Его отношения с Signup:
has_many :signups
has_many :signupers, through: :signups, class_name: 'User'
Регистрация имеет следующие столбцы:
t.integer "exam_id"
t.integer "user_id"
Его отношения с экзаменом: belongs_to: экзамен Его отношения с пользователем: belongs_to: пользователь
Я уже подключили все и сделал кнопку Регистрация на экзамен шоу зрения, который связан с new_signup_path. Дата начала экзамена, имя субъекта и профессор появляются в форме, когда пользователь перенаправляется на него. Таким образом, пользователь должен нажать кнопку «Отправить» только.
Это форма:
<%= form_for @signup do |f| %>
<%= f.fields_for :exam do |e| %>
<%= e.fields_for :subject do |s| %>
<%= s.label :name, "Subject" %>
<%= s.select :name do %>
<% [[@exam.subject.name]].each do |c| %>
<%= content_tag(:option, c.first, value: c.last) %>
<% end %>
<% end %>
<% end %>
<%= e.fields_for :professor do |p| %>
<%= p.label :professor, "Professor" %>
<%= p.select :first_name, :last_name do %>
<% [[@exam.professor.first_name + " " + @exam.professor.last_name]].each do |c| %>
<%= content_tag(:option, c.first, value: c.last) %>
<% end %>
<% end %>
<% end %>
<%= e.label :start_date %>
<%= e.date_field :start_date, value: @exam.start_date %>
<% end %>
<%= f.submit "Submit", class: "btn btn-medium btn-primary col-md-3" %>
<% end %>
Все необходимые данные отображаются в форме, но когда я отправить форму он говорит, что субъект в @ exam.subject.name не определен. Тогда я понял, что мне также нужно разрешить этот параметр, а также имя профессора. Поэтому я поместил его в signup_params в контроллере регистрации и определил его в новом действии, но проблема в том, что он его не распознает (неопределенный метод `subject 'для nil: NilClass).
Вот та часть контроллера (я также попробовал некоторые другие варианты, но это не сработало Это только последняя из них.):
def new
@signup = Signup.new
@exam = Exam.find(params[:exam_id])
@exam.subject = Subject.find(params[:subject_id])
@exam.professor = Professor.find(params[:professor_id])
end
def create
@signup = Signup.new(signup_paramas)
@signup.user_id = current_user.id
if @signup.save
flash[:success] = "You signed up for the exam."
redirect_to @signups
else
render :new
end
end
private
def signup_paramas
params.permit(:exam_id, :user_id).merge(subject_id: @exam.subject.id, professor_id: @exam.professor.id)
end
Основная проблема заключается в том, что я не» t знать, как передать тему и параметры профессора, чтобы быть узнаваемым.
Я ценю любую помощь. Спасибо заранее
PS: Я также положил accepts_nested_attributes_for в модель экзамена.
Причина этого заключается в том, что перед нажатием кнопки отправки '@ exam' является' nil', который является таким же, как 'null' в Java/C#/etc, в вашей форме вы пытаетесь получить' subject' поле, когда вы видите «неопределенный метод для nil: NilClass», помните об ошибке NullPointerException в Java/C#/etc. – niceman
Я боролся с этим через весь проект. Я смог решить что-то. в некоторых случаях. – Aida