рельсы формируются новым методом в другом контроллере - PullRequest
1 голос
/ 27 апреля 2020

Привет :) Итак, я хочу добавить новую форму Отзыв на странице шоу. Стажировка.

Таблица стажировок

 create_table "internships", force: :cascade do |t|
    t.string "adress"
    t.string "zipcode"
    t.string "city"
    t.string "specialty"
    t.string "organization"
    t.string "population"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "user_id"
    t.text "description"
    t.string "title"
    t.string "cursus"
    t.float "duration"
    t.string "region"
    t.integer "remuneration"
    t.index ["user_id"], name: "index_internships_on_user_id"
  end

Таблица отзывов

create_table "reviews", force: :cascade do |t|
    t.string "title"
    t.float "notation"
    t.text "description"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "review_user_id"
    t.bigint "review_internship_id"
    t.index ["review_internship_id"], name: "index_reviews_on_review_internship_id"
    t.index ["review_user_id"], name: "index_reviews_on_review_user_id"
  end

Это две модели связаны между собой. Если вы делаете @ internship.reviews, у вас есть все отзывы о стажировке, а если вы делаете @ review.review_internship, у вас есть стажировка этого конкретного отзыва.

Я не знаю, как изменить свой новый Форма обзора, чтобы я мог сделать новый отзыв, на моей странице показывает стажировку. Я получаю NameError в Internships # show, возможно ли это сделать? Новый обзор связан только с идентификатором стажировки, поэтому я думаю, что лучше всего, если форма нового обзора находится на странице показа стажировки. Я не знаю, есть ли лучший способ сделать это ...

Просмотр новой формы

  <%= form_with(model: review, local: true) do |form| %>

  <div class="field">
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>

  <div class="field">
    <%= form.label :notation %>
    <%= form.number_field :notation %>
  </div>

  <div class="field">
    <%= form.label :description %>
    <%= form.text_area :description %>
  </div>

  <div class="field">
    <%= form.label :review_internship %>
    <%= form.number_field :review_internship %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

Просмотр контроллера

class ReviewsController < ApplicationController
  before_action :set_review, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!

  # GET /reviews/new
  def new
    @review = Review.new
  end

  # GET /reviews/1/edit
  def edit
    current_user_must_own_review
  end

  # POST /reviews
  # POST /reviews.json
  def create
    @review = Review.new(review_params)
    @review.review_user = current_user

    respond_to do |format|
      if @review.save
        format.html { redirect_to @review, notice: 'Review was successfully created.' }
        format.json { render :show, status: :created, location: @review }
      else
        format.html { render :new }
        format.json { render json: @review.errors, status: :unprocessable_entity }
      end
    end
  end

Так что в основном мой вопрос Может ли контроллер Internship вызвать метод create для контроллера Review?

Надеюсь, мой вопрос понятен. Спасибо.

1 Ответ

0 голосов
/ 27 апреля 2020

Добро пожаловать в Stack Overflow!

Вы хотите получить форму для нового обзора на странице показа вашей стажировки. Помните, что для создания новой записи обычно требуется два действия в Rails - new и create. New - это страница, которая обычно имеет форму, а create - это действие после отправки формы.

Теперь, если вы хотите получить форму на странице показа стажировки, вам не нужно new действие больше. Вы можете переместить саму форму в представление для стажировки, и если вы используете какие-либо переменные экземпляра в этой форме, они go в interships_controller#show.

# controllers/internships_controller.rb
...
def show
  ...
  @review = Review.new
end

# views/internships/show.html.erb

<%= form_with(model: @review, local: true) do |form| %>
...

Теперь, когда вы нажмете "Подтвердить" в форме, она все равно будет go до reviews_controller#create. Это из-за того, что с первой строкой в ​​форме происходит какое-то «волшебство» c. Загрузите свою страницу в браузере и проверьте форму в инспекторе. Это будет выглядеть примерно так (плюс намного больше атрибутов).

<form action="/reviews" method='post'>

Это означает, что когда вы нажмете "Отправить", он отправит HTTP-запрос после отправки, который переходит на /reviews. Если вы правильно настроили свои маршруты, вы можете проверить с помощью rails routes в терминале и увидеть, что это будет go до reviews_controller до create действия. Таким образом, вы можете обработать логику c создания нового обзора. Если вы новичок, я бы порекомендовал вам удалить весь блок respond_to и сделать это вместо этого:

# controllers/reviews_controller.rb

 def create
    @review = Review.new(review_params)
    @review.review_user = current_user

    if @review.save
      redirect_to @review, notice: 'Review was successfully created.' }
    else
      render :new
    end
  end
end

И здесь у вас есть возможность перенаправить обратно на страницу показа стажировок. Но как узнать, для какой стажировки этот обзор был только что сделан? Вы только что создали поле в форме, которая хороша - но не очень интуитивно понятна для пользователя. Он / она находится на странице показа стажировки и теперь должен указать, для какой стажировки этот обзор? Далее вы должны взглянуть на вложенные ресурсы, но для этого вопроса было бы немного.

Еще один совет: вы назвали внешний ключ для стажировок в таблице отзывов review_internship_id, что немного необычно, что Вы можете видеть, когда вы звоните @review.review_internship. Просто internship - это хорошо, и тогда вы можете сделать @review.internships - коротко и просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...