Я проверил различные доступные решения, но, похоже, ни одно из них не решает проблему, с которой я столкнулся в своем проекте.Я пытаюсь разрешить пользователю создавать отзывы по модели EmployerReview
для работодателя.Когда я передаю employer_id
на form_for
в employer_reviews_controller
, он заявляет, что не может найти работодателя без удостоверения личности.Идентификатор передается с переменной экземпляра @employer
.Я не понимаю, почему это не работает.Наконец, я использую friendly_id
, и в конце нового адреса проверки работодателя отображается Employer_reviews / new.bryers .Как я могу предотвратить возникновение этой ошибки?
схема
create_table "employer_reviews", force: :cascade do |t|
t.text "review_body"
t.string "review_title"
t.bigint "user_id"
t.bigint "employer_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["employer_id"], name: "index_employer_reviews_on_employer_id"
t.index ["user_id"], name: "index_employer_reviews_on_user_id"
end
Employee_review.rb
class EmployerReview < ApplicationRecord
belongs_to :employer
belongs_to :user
end
user.rb
class User < ApplicationRecord
has_many :employer_reviews, dependent: :destroy
end
Employer.RB
class Employer < ApplicationRecord
extend FriendlyId
friendly_id :username, use: [:slugged, :finders]
has_many :employer_reviews, dependent: :destroy
end
Employers_controller.rb
class EmployersController < ApplicationController
before_action :set_employer, only: [:show]
def show
impressionist(@employer)
end
private
def set_employer
@employer = Employer.find(params[:id])
end
end
Employer_reviews_controller.rb
class EmployerReviewsController < ApplicationController
before_action :set_employer_review, only: [:show, :edit, :update, :destroy]
before_action :set_employer
before_action :authenticate_user!
# GET /employer_reviews/1
# GET /employer_reviews/1.json
def show
end
# GET /employer_reviews/new
def new
@employer_review = EmployerReview.new
end
# GET /employer_reviews/1/edit
def edit
end
# POST /employer_reviews
# POST /employer_reviews.json
def create
@employer_review = EmployerReview.new(employer_review_params)
@employer_review.user_id = current_user.id
@employer_review.employer_id = @employer_review.id
respond_to do |format|
if @employer_review.save
format.html {redirect_to @employer_review, notice: 'Employer review was successfully created.'}
format.json {render :show, status: :created, location: @employer_review}
else
format.html {render :new}
format.json {render json: @employer_review.errors, status: :unprocessable_entity}
end
end
end
# PATCH/PUT /employer_reviews/1
# PATCH/PUT /employer_reviews/1.json
def update
respond_to do |format|
if @employer_review.update(employer_review_params)
format.html {redirect_to @employer_review, notice: 'Employer review was successfully updated.'}
format.json {render :show, status: :ok, location: @employer_review}
else
format.html {render :edit}
format.json {render json: @employer_review.errors, status: :unprocessable_entity}
end
end
end
# DELETE /employer_reviews/1
# DELETE /employer_reviews/1.json
def destroy
@employer_review.destroy
respond_to do |format|
format.html {redirect_to employer_reviews_url, notice: 'Employer review was successfully destroyed.'}
format.json {head :no_content}
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_employer_review
@employer_review = EmployerReview.find(params[:id])
end
def set_employer
@employer = Employer.find(params[:employer_id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def employer_review_params
params.require(:employer_review).permit([:review_title, :review_body])
end
end
работодатель show.html.erb
<%= link_to 'Write a review', new_employer_review_path(@employer) %>
rout.rb
resources :employers
resources :employer_reviews
форма обзора
<%= simple_form_for([@employer, @employer_review]) do |f| %>
<%= f.error_notification %>
<div class="form-group">
<label>Review Title</label>
<%= f.input :review_title, class: 'form-control', placeholder: 'Add a review title' %>
</div>
<div class="form-group">
<label>Tell us about your experience</label>
<%= f.input :review_body, :as => :text, :input_html => { 'rows' => 5, 'cols' => 10 }, class: 'form-control', placeholder: 'Add a review title' %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
ОБНОВЛЕНИЕ 1: Я получаю сообщение об ошибке ниже, когда использую @employer_review и @employer в simple_form.
ActionView::Template::Error (undefined method `model_name' for nil:NilClass):
1: <%= simple_form_for([@employer_review, @employer]) do |f| %>
2: <%= f.error_notification %>
3: <div class="form-group">
4: <label>Review Title</label>
app/views/employer_reviews/_form.html.erb:1:in `_app_views_employer_reviews__form_html_erb__154747394_155744960'
app/views/employer_reviews/new.html.erb:3:in `_app_views_employer_reviews_new_html_erb__376973310_155859880'
Processing by ExceptionHandler::ExceptionsController#show as HTML
Parameters: {"employer_id"=>"test_employer"}
Completed 500 Internal Server Error in 404ms (ActiveRecord: 0.0ms)