ActiveRecord :: RecordNotFound (Не удалось найти работодателя без идентификатора) при использовании формы Rails 5 - PullRequest
0 голосов
/ 24 октября 2018

Я проверил различные доступные решения, но, похоже, ни одно из них не решает проблему, с которой я столкнулся в своем проекте.Я пытаюсь разрешить пользователю создавать отзывы по модели 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)

1 Ответ

0 голосов
/ 24 октября 2018

Ваши ресурсы employers и employer_reviews не являются вложенными.Это означает, что employer_id параметр в вашем EmployerReviewsController равен nil (если он не установлен явно в строке запроса).Вызов фильтра set_employer не имеет никакого эффекта, а переменная экземпляра @employer равна nil.Вот почему simple_form не может найти этого работодателя (без идентификатора).

Вы должны либо превратить employer_reviews в вложенный ресурс из employers, либо удалить переменную @employer из EmployerReviewsController и использовать simple_form исключительно для @employer_review.

...