Невозможно отправить форму в Rails

#ruby-on-rails #ruby-on-rails-4 #simple-form

#ruby-on-rails #ruby-on-rails-4 #простая форма

Вопрос:

У меня есть 2 модели, называемые инструктором и запросом, связанные вместе. Я хотел бы отправить запрос, который принадлежит инструктору, но на консоли появляется следующая ошибка. Кто-нибудь может мне помочь?. Спасибо,

 Processing by RequestsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"SaLDbXaZOy2cvGILrC9IJ7vInkF0xG42bf84k3IcDj eFN9lTRfZlkGUMr8s82zQEdO9dgJ3Set935RGH8uv9w==", "request"=>{"name"=>"dsada", "email"=>"dsadas", "phone"=>"sadsadd", "message"=>"sadsa"}, "commit"=>"Create Request"}
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
No template found for RequestsController#create, rendering head :no_content
Completed 204 No Content in 38ms (ActiveRecord: 0.3ms)
  

Форма запроса

     <hr>
<%= simple_form_for([@request, @instructor.requests.build], :url =>{ :controller =>"requests",
                                              :action => "create" }) do |f| %>
  <%= f.input :name, label: "Your name" %>
  <%= f.input :email %>
  <%= f.input :phone, label: "Phone number" %>
  <%= f.input :message, as: :text %>
  <br>
  <%= f.button :submit, class: "btn btn-danger" %>
<% end %>
<br>
<br>
  

запрашивает контроллер

     class RequestsController < ApplicationController

  def index
    if params[:search].present?
      @instructors = Instructor.near(params[:search], 50)
    else
      # Shows all listed instructors by the created date.
      @instructors = Instructor.order('created_at DESC')
    end
  end

  def show
    @instructor = Instructor.find(params[:id])
  end

  def create
    @request = Request.new(request_params)

    if @request.save
      redirect_to "root"
    end
  end

  private

  def request_params
    params.require(:request).permit(:name, :email, :phone, :message)
  end
end
  

Ответ №1:

Если ваш контроллер запросов вложен в instructor, вы, вероятно, имели в виду:

 simple_form_for([@instructor, @instructor.requests.build], ...
  

Кроме того, для этих контроллеров очень часто:

 @instructor = Instructor.find(params[:id])
@request = @instructor.requests.new(request_params)
if @request.save
  # ...
  

Удалите :url =>{ :controller =>"requests", :action => "create" ее избыточность, конструктор форм должен понять это из [@request, @instructor.requests.build]

Если @request сохранено, вы перенаправляетесь на root_path, но вы ничего не делаете, если запросы завершаются неудачно (что, похоже, имеет место), это также часто render "new" встречается в этих случаях. Смотрите Пример контроллера в руководствах: http://guides.rubyonrails.org/action_controller_overview.html#parameters .

В конечном счете вы можете изменить это поведение по умолчанию, но я рекомендую вам начать с основ и изменить его, как только вы узнаете, как это работает.

Комментарии:

1. Я на самом деле забыл указать маршруты запросов под инструкторами!

2. Не уверен, как отправить на этот маршрут? instructor_requests POST /instructors/:instructor_id/запросы (.:format) запросы#создать

3. Прошу прощения за то, что не разместил достаточно информации. Пожалуйста, взгляните на github github.com/FaisalFehad/instructor_finder

4. Вы уже отправляете на этот маршрут; проблема, я полагаю, в том, что реагирует, когда @request не сохраняется.

Ответ №2:

Ваша модель недействительна, поэтому она не перенаправляет (потому save что возвращает false ). Поэтому вам нужно переписать update действие:

 def create
  @request = Request.new(request_params)

  if @request.save
    redirect_to "root"
  else
    render :new
  end
end
  

Обновить:

Вы используете Rails 5.0, поэтому, если вы объявите belongs_to , это также добавит проверку присутствия для внешнего ключа. Итак, вам нужно создать объект запроса таким образом:

 @request = Instructor.find(params[:instructor_id]).requests.build(request_params)
  

Комментарии:

1. Я не уверен, почему он возвращает false ?. Также все еще получаю (0,1 мс) начало транзакции (0,1 мс) откат транзакции

2. Я не вижу вашу модель, поэтому не могу сказать, какие у нее проверки. Можно догадаться, dsadas что это недействительное электронное письмо

3. У меня еще не было никаких подтверждений! его единственный (запрос) принадлежит_то:инструктору и (инструктор) имеет_мани:запросы

4. Прошу прощения за то, что не разместил достаточно информации. Пожалуйста, взгляните на github github.com/FaisalFehad/instructor_finder

5. @Faisal после просмотра вашего кода я добавил раздел Обновления в свой ответ.