2016-01-11 10 views
0

Я создаю игру мелочей, в которой есть несколько категорий (например, спорт, история, искусство и т. Д.). В конце игры каждой категории я хочу показать таблицу результатов только для этой категории.Вызов одного метода из контроллера Rails

Определяя категорию в методе, я теперь успешно отфильтрован только для оценки истории, как показано здесь:

class ScoreboardController < ApplicationController 
    def index 
     @participations = Participation.where(finished: true, category: "history").order(score: :desc) 
    end 
end 

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

Для того, чтобы это произошло, я попытался создать второй метод в контроллере для:

@participations = Participation.where(finished: true, category: "sports").order(score: :desk) 

К сожалению, до сих пор только вернулся из оценки первого метода истории без каких-либо спортивных соревнований.

Я думаю, что я делаю один из двух вещей неправильно:

1) Могу ли я неправильно пишущих методы путем добавления дополнительных итераций в том же контроллере?

2) На табло (в отличие от контроллера табло), я неправильно звоню контроллеру.

Любые идеи, в которых я ошибаюсь?

Дополнительная информация: Табло Посмотреть

<thead> 
    <tr> 
    <th>#</th> 
    <th>User</th> 
    <th>Category</th> 
    <th>Score</th> 
    </tr> 
</thead> 

<tbody> 
    <% @participations.each_with_index do |participation, index| %> 
    <tr> 
     <td>#<%= index + 1 %></td> 
     <td><%= participation.user.username %></td> 
     <td><%= participation.category %></td> 
     <td><%= participation.score %></td> 
    </tr> 
    <% end %> 
</tbody> 

+0

Пожалуйста, пост кода контроллера, а не только отрывки – Tim

+0

- @ Тима это табло со ntroller выше. Вы просите модель участия, на которую ссылаетесь? – darkginger

ответ

1

Вы должны изменить свой индекс ScoreboardController содержать различные переменные экземпляра для различных категорий. то есть:

ScoreboardController.rb

def index 
    @participations_score = Participation.where(finished: true, category: "history").order(score: :desc) 
    @participations_history = Participation.where(finished: true, category: "sports").order(score: :desc) 
    # other particpation categories 
end 

index.html.erb

<h1>History Scoreboard</h1> 

<thead> 
    <tr> 
    <th>#</th> 
    <th>User</th> 
    <th>Category</th> 
    <th>Score</th> 
    </tr> 
</thead> 

<tbody> 
    <% @participations_history.each do |participation_history| %> 
    <tr> 
     <td>#<%= participation_history.id %></td> 
     <td><%= participation_history.username %></td> 
     <td><%= participation_history.category %></td> 
     <td><%= participation_history.score %></td> 
    </tr> 
    <% end %> 
</tbody> 

<!--- Add more code for the rest of the categories ---> 

Я настоятельно рекомендую вам освежить свои знания языка программирования Ruby, а также структура Ruby on Rails. Вы можете сделать это, перейдя на Code academy.

+0

Изменение индекса похоже на самое легкое решение здесь. Я попробовал это, создав переменную-экземпляр для участия, чтобы попробовать, но она возвращает ошибку: 'undefined method each_' в файле index.html после использования вашего кода. Есть ли дополнительная магия, необходимая для идентификации экземпляра в html-файле табло? – darkginger

+0

@darkginger, я изменил код, чтобы удалить синтаксическую ошибку. Это должно быть '@ attendations_history.each' not' @ attendations_history.each_' – apebeast

+0

Это работает. Хороший улов. Спасибо за помощь. – darkginger

0

Похоже, работа для nested resources с singular resource для:

#config/routes.rb 
resources :categories do 
    resource :scoreboard, module: :categories #-> url.com/categories/:category_id/scoreboard 
end 

#app/controllers/categories/scoreboards_controller.rb 
class Categories::ScoreboardsController < ApplicationController 
    def show 
     @results = Participation.where(finished: true, category: params[;category_id]).order(score: :desc) 
    end 
end 

Это позволит вам вызвать scoreboards#show действие, заселение с соответствующим category из маршрутов ....

#app/controllers/categories_controller.rb 
class CategoriesController < ApplicationController 
    def create 
     @category = ... 
     redirect_to [@category, :scoreboard] 
    end 
end 

Ассоциации

Теперь, есть лучший путь.

Вместо вызова Participation голых, вы будете лучше всего с помощью categories и scoreboards ассоциации вы должны установили в бэкэнде:

#app/models/category.rb 
class Category < ActiveRecord::Base 
    has_many :participations 
    has_many :scoreboards, through: :participations 
end 

#app/models/participation.rb 
class Participation < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :scoreboard 
end 

#app/models/scoreboard.rb 
class Category < ActiveRecord::Base 
    has_many :participations 
    has_many :categories, through: :participations 
end 

Это позволит использовать одни и те же маршруты, что и выше , но на этот раз наполнение ответа через ассоциацию:

#app/controllers/categories/scoreboards_controller.rb 
class Categories::ScoreboardsController < ApplicationController 
    def show 
     @category = Category.find params[:id] 
     @results = @category.participations.where(participation: {attribute: true}) 
    end 
end 
Смежные вопросы