Как отобразить элементы has_many в представлении для показа? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть запись студента и субаренды в моей базе данных. Таким образом, субаренду принадлежит Студент.

Модель студента

class Student < ApplicationRecord
  has_many :sublet_posts, :dependent => :destroy
end

Модель субаренды

class SubletPost < ApplicationRecord
    belongs_to :student

end

Маршрут

Rails.application.routes.draw do
  resources :sublet_posts
  resources :students
end

Контроллер студента

class StudentsController < ApplicationController
  before_action :set_student, only: [:show, :edit, :update, :destroy]

  # GET /students
  # GET /students.json
  def index
    @students = Student.all
  end

  # GET /students/1
  # GET /students/1.json
  def show
    # student_id should be the current user id 
    @sublet_posts = SubletPost.where(student_id:1)
  end

  # GET /students/new
  def new
    @student = Student.new
  end

  # GET /students/1/edit
  def edit
  end

  # POST /students
  # POST /students.json
  def create
    @student = Student.new(student_params)

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

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

  # DELETE /students/1
  # DELETE /students/1.json
  def destroy
    @student.destroy
    respond_to do |format|
      format.html { redirect_to students_url, notice: 'Student was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

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

    # Only allow a list of trusted parameters through.
    def student_params
      params.require(:student).permit(:fname, :lname, :email, :password, :phone, :dob)
    end
end

Представление студенческого шоу

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

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

В контроллере студента у меня есть @sublet_posts = SubletPost.where (student_id: 1), но я жестко запрограммировал student_id: 1, поэтому каждый пост создан находится в идентификаторе студента: 1. Есть ли способ отобразить субаренду поста для студента, которому он принадлежит?

Кроме того, в _form в субаренду пост

<%= form_with(model: sublet_post, local: true) do |form| %>
  <% if sublet_post.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(sublet_post.errors.count, "error") %> prohibited this sublet_post from being saved:</h2>

      <ul>
      <% sublet_post.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>


  <div class="field">
    <%= form.hidden_field :student_id, :value => '1' %>
  </div>
  <div class="actions">
    <%= form.submit %>
  </div>


<% end %>

I присвоил скрытое значение 1, но есть ли способ присвоить его для student.id, который принадлежит?

Спасибо за любую помощь.

1 Ответ

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

Вы должны сделать следующее: (у вас есть before_action, чтобы вытащить студента, просто используйте его.)

def show
  @sublet_posts = @student.sublet_posts if @student.present?
end

на ваш взгляд, просто итерируйте @sublet_posts:

<% @sublet_posts.each do |sb| %>
  <%= sb.created_at %>
  <%= link_to "Edit", edit_sublet_post_path(sb.id) %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...