Извлечение записи через параметры получает ошибку неопределенного метода для `id` - PullRequest
0 голосов
/ 04 июня 2018

В моем ReviewsController у меня есть два частных метода, вызываемых в before_action:

def find_course
  @course = Course.where(:id=>params[:course_id]).first
end

def find_professor
  @professor = Professor.where(:id=>params[:professor_id]).first
end

Я запрашиваю Course через параметры, и по какой-то причине я получаю undefined methodid 'for nil: NilClass` Ошибка в моем методе создания:

def create
  @review = Review.new(review_params)
  @review.course_id = @course.id
  @review.professor_id = @professor.id
  @review.user_id = current_user.id

  if @review.save
    redirect_to course_path(@course)
  else
    render 'new'
  end
end

Метод создания вызывается в частичной форме, например:

<%= simple_form_for @review do |f| %>
  <%= f.input :rating %>
  <%= f.input :comment %>
  <%= f.button :submit %>
<% end %>

Форма отображается черезссылка в шаблоне шоу курса:

<h2><%= @course.name %></h2>
<table class="table">
  <thead>
    <tr>
      <th scope="col">Professors</th>
      <th scope="col">Reviews</th>
    </tr>
  </thead>
  <tbody>
    <% @course.professors.each do |professor| %>
      <tr>
        <td><%= professor.name %></td>
        <td><%= link_to "Add Review", new_review_path(course_id: @course.id, professor_id: professor.id) %></td>
      </tr>
    <% end %>
  </tbody>
</table>

и new_review_path, как определено в routes.rb:

resources :reviews, path_names: { new: 'course/:course_id/professor/:professor_id' }

По какой-то странной причине, если я заменю @course = Course.where(:id=>params[:course_id]).first на @course = Course.find(7) (7 является идентификатором существующего курса), метод create работает отлично.Как правильно извлечь записи курса и профессора с заданными параметрами?

Ответы [ 3 ]

0 голосов
/ 04 июня 2018
<td><%= link_to "Add Review", new_review_path(course_id: @course.id, professor_id: professor.id) %></td>

Пройдет reviews/new.html.erb,

, здесь вам нужно будет отправить course_id и professor_id со скрытым полем, чтобы вы могли получить @course и @professor досоздать действие.в противном случае @course и @professor вернут nil.

Модифицированный код: -

Насколько я понимаю, вам не нужно find_professorи find_course перед созданием действия, так как эти два поля уже находятся в Review Model, поэтому просто передайте его вместе с оболочкой form_for и передайте все вместе в strong_params

<%= simple_form_for @review do |f| %>
  <%= f.input :rating %>
  <%= f.input :comment %>
  <%= f.hidden_field :course_id, :value => params[:course_id]%>
  <%= f.hidden_field :professor_id, :value => params[:professor_id] %>
  <%= f.hidden_field :user_id, :value => current_user.id %>
  <%= f.button :submit %>
<% end %>

в контроллере

def create
  @review = Review.new(review_params)
  if @review.save
    course = @review.course
    #redirect_to course_path(@course)
    redirect_to course_path(course)
  else
    render 'new'
  end
end

private
  def review_params
    params.require(:review).permit(:rating,:comment,:course_id, :professor_id, :user_id)
  end
0 голосов
/ 04 июня 2018

Перед вызовом .id

, например:

if @course && @professor
  @review = Review.new(review_params)
  @review.course_id = @course.id
  @review.professor_id = @professor.id
  @review.user_id = current_user.id

  if @review.save
    redirect_to course_path(@course)
  else
    render 'new'
  end
end
, вам необходимо проверить, выбраны ли объекты курса и профессора.
0 голосов
/ 04 июня 2018

Это хорошая привычка,

@course = Course.find(params[:course_id])
@professor = Professor.find(params[:professor_id])

Пожалуйста, следуйте выше, вы можете получить оба правильно.

...