2014-10-12 3 views
1

Я создаю приложение с моделью языка, модель вопроса и модель ответа. Я хотел бы, чтобы отобразить список вопросов и ответы на один «Мои вопросы» Индексный просмотр странице в следующих категории:Как классифицировать данные на одном виде

  1. Моих Вопросов без ответов (имеется в виде только вопросы, относящиеся к текущему пользователю)
  2. Моим Ответили Вопросы (то есть только вопросы, относящиеся к текущему пользователю)
  3. вопросов Я ответил (смысл только ответы, относящиеся к текущему пользователю)

Я новичок в программирование, и я не уверен, что если исследующее слово «категория» в Rails был правильным для этого, bu Я так и не смог найти полезную информацию. Любое понимание было бы высоко оценено!

Вот мои маршруты:

Languagecheck::Application.routes.draw do 
    devise_for :users 
    resources :users 

    resources :languages do 
    resources :questions, except: [:index] do 
     resources :answers 
    end 
    end 

    resources :questions, only: [:index, :new, :create] 

    get 'about' => 'welcome#about' 
    root to: 'welcome#index' 
    end 

Вот мой вопрос модель:

class Question < ActiveRecord::Base 
    require 'obscenity/active_model' 
    has_many :answers, dependent: :destroy 
    accepts_nested_attributes_for :answers, :reject_if => :all_blank, :allow_destroy=>true 
    belongs_to :user 
    belongs_to :language 

    default_scope { order('created_at DESC') } 


    validates :body, obscenity: true 
    validates :body, length: { minimum: 10, maximum: 160 }, presence: true 
    validates :user, presence: true 

end 

Вот мой ответ Модель:

class Answer < ActiveRecord::Base 
    require 'obscenity/active_model' 
    belongs_to :question 
    belongs_to :user 

validates :name, obscenity: true 
validates :body, length: { minimum: 1, maximum: 160 }, presence: true 

end 

Моя модель пользователя устанавливается где у пользователя много вопросов и ответов.

Вот мои вопросы управления:

class QuestionsController < ApplicationController 
    before_action :set_language, except: [:index] 
    before_action :set_question, only: [:show, :edit, :update, :destroy] 

    def index 
    @questions = current_user.questions 
    end 

    def show 
    @question = Question.find(params[:id]) 
    @answer = Answer.new 
    end 

    def new 
    @question = Question.new 
    authorize @question 
    end 

    def edit 
    @question = Question.find(params[:id]) 
    authorize @question 
    end 

    def update 
    @question = Question.find(params[:id]) 
    authorize @question 

    if @question.update_attributes(question_params) 
     flash[:notice] = "Question was updated." 
     redirect_to [@language, @question] 
    else 
     flash[:error] = "There was an error saving the question. Please try again." 
     render :edit 
    end 
    end 

    def create 
    @question = Question.new(question_params) 
    @question.language = @language 
    @question.user = current_user 
    authorize @question 

    if @question.save 
     flash[:notice] = "Question was saved." 
     redirect_to [@language, @question] 
    else 
     flash[:error] = "There was an error saving the question. Please try again." 
     render :new 
    end 
    end 
    def destroy 
    @question.destroy.find(params[:id]) 
    respond_to do |format| 
     format.html { redirect_to questions_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    def set_question 
     @question = Question.find(params[:id]) 
    end 

    def question_params 
     params.require(:question).permit(:id, :body) 

    end 

    def set_language 
     @language = Language.find(params[:language_id]) 
    end 

end 

Вот мой ответ контроллер:

class AnswersController < ApplicationController 
    before_action :set_language_and_question 
    before_action :set_answer, only: [:show, :edit, :update, :destroy] 

    def index 
    @answers = Answer.all 
    end 

    def show 
    end 

    def new 
    @answer = Answer.new 
    end 

    def edit 
    end 

    def create 
    @answer = Answer.new(answer_params) 
    @answer.question = @question 
    @answer.user = current_user 

    respond_to do |format| 
     if @answer.save 
     format.html { redirect_to [@language, @question], notice: 'Answer was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @answer } 
     else 
     format.html { redirect_to [@language, @question], error: 'Answer was not successfully created.' } 
     format.json { render json: @answer.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 
    respond_to do |format| 
     if @answer.update(answer_params) 
     format.html { redirect_to @answer, notice: 'Answer was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @answer.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
    @answer.destroy 
    respond_to do |format| 
     format.html { redirect_to answers_url } 
     format.json { head :no_content } 
    end 
    end 

    private 

    def set_answer 
     @answer = Answer.find(params[:id]) 
     @answer ||= @question.answers.new 
    end 

    def answer_params 
     params.require(:answer).permit(:id, :body) 
    end 

    def set_language_and_question 
     @language = Language.find(params[:language_id]) 
     @question = Question.find(params[:question_id]) 
    end 
end 

А вот вид «Мои вопросы» (который просто перечислить все вопросы на данный момент) :

<div class="row"> 
    <div class="col-md-8"> 
     <h3>My Unanswered Questions</h3> 
     <% @questions.each do |question| %> 
     <div class="media"> 
      <div class="media-body"> 
      <h4 class="media-heading"> 
     <p><%= question.language ? link_to(question.body, [question.language, question]) : question.body %></p> 
      </h4> 
      <small> 
       submitted <%= time_ago_in_words(question.created_at) %> ago by <%= question.user.name %> <br/> 
       <%= question.answers.count %> Answers 
      </small> 
      </div> 
     </div> 
     <% end %> 
     </div> 
     <br/> 
     <br/> 
    <div class="col-md-4"> 
     <%= link_to "Ask a New Question", new_question_path, class: 'btn btn-success' %> 
    </div> 
</div> 

<div class="row"> 
    <div class="col-md-8"> 
     <h3>My Answered Questions</h3> 
     <% @questions.each do |question| %> 
     <div class="media"> 
      <div class="media-body"> 
      <h4 class="media-heading"> 
     <p><%= question.language ? link_to(question.body, [question.language, question]) : question.body %></p> 
      </h4> 
      <small> 
       submitted <%= time_ago_in_words(question.created_at) %> ago by <%= question.user.name %> <br/> 
       <%= question.answers.count %> Answers 
      </small> 
      </div> 
     </div> 
     <% end %> 
     </div> 
</div> 

<div class="row"> 
    <div class="col-md-8"> 
     <h3>Questions I Answered</h3> 
     <% @questions.each do |question| %> 
     <div class="media"> 
      <div class="media-body"> 
      <h4 class="media-heading"> 
     <p><%= question.language ? link_to(question.body, [question.language, question]) : question.body %></p> 
      </h4> 
      <small> 
       submitted <%= time_ago_in_words(question.created_at) %> ago by <%= question.user.name %> <br/> 
       <%= question.answers.count %> Answers 
      </small> 
      </div> 
     </div> 
     <% end %> 
     </div> 
</div> 
+1

Я не на 100% понят, что вы имеете в виду по категориям, но достаточно ли добавить 3 области в вашу модель вопроса (по одному для каждого из трех случаев, о которых вы упоминаете), использовать их для заполнения 3 переменные экземпляра в вашем 'QuestionController # index', а затем использовать их в своем шаблоне? – Matt

+0

Они говорят, что группируют их без ответа/ответили/я ответил, 3 категории. Я думаю, что у вас есть 2 типа ответов (ответ/ответ), а второй тип - ответ. Либо это, либо два типа: вопрос/ответ, с вопросом, имеющим ответное логическое значение, с которым вы используете group_by. –

ответ

0

Valerie,

Как и Мэтт, я не совсем уверен, что вы подразумеваете под «категоризацией». Похоже, вы хотите, чтобы можно было перебирать различные группы вопросов на данной странице. Так что-то вроде этого:

<% @user.unanswered_questions.each do |question| %> 
    ... 
<% end %> 

<% @user.answered_questions.each do |question| %> 
    ... 
<% end %> 

<% @user.answers.each do |answer| %> 
    ... 
<% end %> 

На одном взгляде.

Если это то, что вы имеете в виду, то предложение Мэтта звучит как правильный. Вам просто нужно создать области или методы на question.rb, чтобы служить этой цели. Я бы на самом деле создать ниже областей на вопрос:

scope :answered, -> { joins(:answers) } 
scope :unanswered, -> { where.not(id: joins(:answers).pluck(:id)) } 

Вы бы тогда быть в состоянии сделать @user.questions.answered и @user.questions.unanswered (немного отличается от указанного выше, но как вариант). Этот второй немного сложнее. В основном, мы получаем вопросы с ответами (joins(:answers)), беря их идентификаторы (pluck(:id)), а затем захватываем все вопросы с идентификаторами NOT в этой коллекции (т.е. те, у которых нет ответов). I думаю это будет работать, но я не проверял это. Для получения дополнительной информации ознакомьтесь с документами AR: http://guides.rubyonrails.org/active_record_querying.html

Это вы имеете в виду?Как правило, в Rails с такими вопросами, которые связаны с сегментацией (или категоризацией) данных, вы хотите подумать о том, чтобы подталкивать эту функциональность до уровня модели, где она наиболее абстрактна.

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

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