Не могу найти `без ID - PullRequest
       0

Не могу найти `без ID

3 голосов
/ 19 апреля 2020

У меня есть таблица Student и таблица Sublet Post в базе данных.

В представлении Student Show

<p id="notice"><%= notice %></p>

<div>
  <h3>Sublet Post</h3>
  <%= link_to "New Sublet Post", new_sublet_post_path(:student => @student.id)%>
  <% @sublet_posts.each do |sublet_post| %>
    <%= sublet_post.created_at %>
    <%= link_to "Edit", edit_sublet_post_path(sublet_post.id) %>
  <% end %>
</div>

Я перешел: студент к новому sublet_post_path.

Sublet Post Controller

class SubletPostsController < ApplicationController
  before_action :set_sublet_post, only: [:show, :edit, :update, :destroy]

  # GET /sublet_posts
  # GET /sublet_posts.json
  def index
    # get all the posts that are not taken and their linked properties
    @sublet_posts = Hash.new
    # get all students who created each post
    @students = Hash.new
    SubletPost.where(taken:false).each do |sublet_post|
      @sublet_posts[sublet_post] = Property.find(sublet_post.property_id)
      @students[sublet_post] = Student.find(sublet_post.student_id)
    end
  end

  # GET /sublet_posts/1
  # GET /sublet_posts/1.json
  def show
  end

  # GET /sublet_posts/new
  def new
    @sublet_post = SubletPost.new
    @student = Student.find(params[:student])
  end

  # GET /sublet_posts/1/edit
  def edit
  end

  # POST /sublet_posts
  # POST /sublet_posts.json
  def create
    @sublet_post = SubletPost.new(sublet_post_params)

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

  # PATCH/PUT /sublet_posts/1
  # PATCH/PUT /sublet_posts/1.json
  def update
    respond_to do |format|
      if @sublet_post.update(sublet_post_params)
        format.html { redirect_to @sublet_post, notice: 'Sublet post was successfully updated.' }
        format.json { render :show, status: :ok, location: @sublet_post }
      else
        format.html { render :edit }
        format.json { render json: @sublet_post.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /sublet_posts/1
  # DELETE /sublet_posts/1.json
  def destroy
    @sublet_post.destroy
    respond_to do |format|
      format.html { redirect_to sublet_posts_url, notice: 'Sublet post was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_sublet_post
      @sublet_post = SubletPost.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def sublet_post_params
      params.require(:sublet_post).permit( :student_id)
    end
end

Sublet Post new

<h1>New Sublet Post</h1>
<h1><%= @student %></h1>


<%= render 'form', sublet_post: @sublet_post %>

В новом действии я выполнил @student = Student.find (params [: student]) с переданным переменный студент. Тем не менее, когда я запускаю это, это дает мне не удалось найти студента без удостоверения личности.

Любая помощь будет очень ценится.

1 Ответ

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

Вам не хватает вложенных ресурсов - когда вы создаете новый sublet post, вы хотите, чтобы студент, который его создал, также.

Чтобы добиться этого, вы можете просто добавить еще один вход в форма, но это не очень элегантно - вы только что пришли из представления студенческого шоу.

Это то, для чего нужны вложенные маршруты - идентификатор для студента будет передан в URL, он будет выглядеть следующим образом

.../students/2/sublet_posts/new

Нам нужно это для обоих действий new и create.

Теперь в файле маршрутов вы можете использовать его так:

# routes.rb

resources :students do 
  resources sublet_post, only: [:new, :create]
end

Примечание , что вам нужно только вложить новое действие и создать действие - позже у вас будет идентификатор, сохраненный в экземпляре sublet_post.

Теперь сначала для формы: она должна выглядеть следующим образом:

<%= simple_form_for [ @student, @sublet_post ] do |f| %>

Теперь в вашем контроллере уже определены обе переменные, просто будьте осторожны, вы должны получить ученика примерно так:

@student = Student.find(params[:student_id])

Это будет правильный способ сделать это. Чтобы связать новые сообщения субаренды, не просто добавьте ученика к помощнику пути, но используйте rails routes в терминале, чтобы найти правильный префикс для помощника пути:

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