#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 после просмотра вашего кода я добавил раздел Обновления в свой ответ.