2013-09-06 8 views
5

Я очень новичок в рубине. У меня есть одно сомнение, как вызвать метод контроллера из представления.вызов метода контроллера из вида Ruby on rails

мой контроллер

def course_user_count 
@courses=Course.all 
@courses.each do |course| 
@count=course.students.count 
end 

я должен назвать эту переменную @count из метода, на мой взгляд course.view.html.erb

+0

Возможный дубликат [Можно ли вызвать метод контроллера из представления (как мы обычно называем хелпера)?] (Http://stackoverflow.com/questions/8906527/can-we-call-a-controllers-method- from-a-view-as-we-call-from-helper-ideal) – lulalala

ответ

8

Я не совсем понимаю, что вы имеете в виду, когда вы говорите, что вы должны «назвать эту @count переменную» с вашей точки зрения. Вы не устанавливаете эту переменную в своем контроллере? Если это так, он должен автоматически быть доступен в соответствующем представлении. (Вы не «вызываете» переменную, вы ее читаете или устанавливаете.)

Во-вторых, ваш метод читает количество учеников каждого курса, а затем присваивает его переменной @count. Каждый раз, когда эта переменная записывается, ее предыдущее значение перезаписывается, поэтому метод, написанный, бесполезен. Я не уверен, что вы пытаетесь сделать здесь - возможно, «инициализируя» контроллер, установив это значение заранее для каждого курса?

По соглашению, метод контроллера show контроллера отображает информацию для одной строки связанной базы данных. Если цель состоит в том, чтобы показать количество студента Курса в этой точке зрения, я хотел бы написать что-то вроде этого в app/controllers/course_controller.rb:

class CourseController < ApplicationController 

    def show 
    @course = Course.find(params[:id]) # Here I assume that the url is .../courses/<id> 
    @student_count = @course.students.count 
    end 

    ... 

end 

и отображать значение переменной, как это в шаблоне app/views/courses/show.html.erb:

<%= @student_count %> 

В других слова, я бы не написал метод в контроллере, чтобы возвращать количество учеников курса, но вместо этого просто передал его как параметр в представление, так же как я бы передал что-то еще, что нужно отобразить, или, по крайней мере, что-либо, что представление не может получить доступ с помощью очень простой операции, условие, которое действительно не выполнено @course.students.count, b это дело вкуса.

Однако может иметь смысл определить метод в контроллере для значений, которые являются более сложными для вычисления и/или не нужны при каждом отображении шаблона . Чтобы сделать этот метод вызываемым из ваших представлений, метод должен быть объявлен вспомогательным методом, как упоминал Кейт в своем ответе.Например, метод, который возвращает общее количество студента всех курсов в app/controllers/course_controller.rb:

class CourseController < ApplicationController 

    helper_method :total_student_count 

    def total_student_count 
    total_count = 0 
    Course.all.each do |c| 
     total_count += c.students.count 
    end 
    total_count 
    end 

    ... 

end 

Используйте метод, как это в любом шаблоне под app/views/courses/, чтобы отобразить значение, возвращаемое этот метод:

<%= total_student_count %> 
0

Ваш контроллер доступен на ваш взгляд, через переменную :

@controller 

который доступен по умолчанию. Конечно, я говорю о контроллере, связанном с этим конкретным видом.

В вашем случае:

@controller.course_user_count 
+0

Это не относится к Rails 5 (или, возможно, 4, но не проверено) – edwardmp

27

В верхней части контроллера вы можете пометить метод, который вы хотите доступны ваши мнения как вспомогательный метод:

helper_method :course_user_count 

Затем на ваш взгляд, вы можете вызвать курс_курс_курс и сохранить результат.

<% count = course_user_count %> 
+4

Этот ответ должен быть принят ... – mahatmanich

+0

@ Маленький update it's 'helper_method: course_user_count' –

+0

Этот ответ сработал для меня на Rails 4.0.0. Большое спасибо! –

1

объявить имя метода в качестве вспомогательного метода

в представлении вызова метода как

<% count = course_user_count %> 
Смежные вопросы