2015-11-16 4 views
1

Я пытаюсь отобразить имя факультета, а не только идентификатор.Ruby on rails - undefined method in show.html.erb

Все остальное работает, кроме той части, где я пытаюсь отобразить имя факультета. Я получаю сообщение об ошибке «неопределенный метод».

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

спасибо.

show.html.erb

<p id="notice"><%= notice %></p> 
<!-- notice is a ruby method, and its results comes here inside the tags 
used when you want the errow page to show on the next page --> 
<p> 
    <strong>Name:</strong> 
    <%= @student.name %> 
</p> 

<p> 
    <strong>Faculty:</strong> 
    <%= @student.faculty_id %> 
    <%= @name.faculty_id %> 


</p> 

<strong>Grade:</strong> 
    <%= @student.grade%> 
</p> 

<%= link_to 'Edit', edit_student_path(@student) %> | 
<%= link_to 'Back', students_path %> 

student.rb

class Student < ActiveRecord::Base 
    belongs_to :faculty 

end 
class Name < ActiveRecord::Base 
    belongs_to :faculty 
end 

faculty.rb

class Faculty < ActiveRecord::Base 
    has_many :student 
    # belongs_to :faculty 
    has_many :name 
end 

Это мой students_controler.rb

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 
    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 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def student_params 
     params.require(:student).permit(:name, :faculty_id) 
    end 
end 

Ошибка не определена метод `faculty_id 'для nil: NilClass

+1

Проводка фактической ошибки будет большой помощью –

ответ

3

Я пытаюсь показать название факультета, а не только ID

Поскольку вы новичок, позвольте мне объяснить это для вас ...

-

Вы в настоящее время вызова @student.faculty_id

Это foreign_key из @student объекта - идентификатор, который связывает этот объект student с соответствующим объектом faculty.

Вкратце, это означает, что этот атрибут является частью схемы student - вы хотите тот, который является частью схемы faculty. Таким образом, вам необходимо либо использовать delegate вызвать атрибут name из faculty, или просто назвать его непосредственно:

@student.faculty.name 

Есть более глубокие проблемы с вашей модели ассоциаций. enter image description here

The above, как они должны быть установлены:

#app/models/student.rb 
class Student < ActiveRecord::Base 
    belongs_to :faculty 
end 

#app/models/faculty.rb 
class Faculty < ActiveRecord::Base 
    has_many :students 
end 

выше позволит назвать следующие:

#app/controllers/students_controller.rb 
class StudentsController < ApplicationController 
    def show 
     @student = Student.find params[:id] 
    end 
end 

#app/views/students/view.html.erb 
<%= @student.faculty.name %> 

Вы должны помнить, что Rails работает на вершине relational database , Это работает, позволяя вам вызывать связанные объекты в силу их внешнего ключа .

При необходимости я могу объяснить больше.

+0

Большое спасибо. Это было очень полезно! – bisuke

0

<%= @name.faculty_id %> не будет работать.

В вашем контроллере нетерпеливого нагрузки факультет

def show 
    @student = Student.includes(:faculty) 
end 

Либо сделать

<% if @student.faculty.present? %> 
    <%= @student.faculty.name %> 
<% end %> 

или вы могли бы получить факультет в контроллере и присвоить его переменной

def show 
    @student = Student.includes(:faculty) 
    @faculty = @student.faculty 
end 

Тогда вы можете использовать это

<% if @faculty.present? %> 
    <%= @faculty.name %> 
<% end %> 
+0

Благодарим за сообщение. Я не понимаю, где должны быть написаны коды, которые вы написали. Не могли бы вы мне помочь? – bisuke

+0

Ну биты, определенные как шоу, должны быть в контроллере, а другой бит в вашем представлении. –

0

Ошибка, которую я вижу

class Faculty < ActiveRecord::Base 
has_many :student 
# belongs_to :faculty 
has_many :name 
end 

Должно быть

class Faculty < ActiveRecord::Base 
has_many :students 
# belongs_to :faculty 
has_many :names 
end 

Я не знаю, ваша ошибка из-за этого или нет, но has_many не с особой формой

Смежные вопросы