2016-04-04 41 views
8

Próbuję dodać model Evaluation do mojej aplikacji Rails 4.Szyny 4 Polimorficzne skojarzenia i obawy

Zrobiłem model o nazwie evaluation.rb. Posiada:

class Evaluation < ActiveRecord::Base 

    belongs_to :evaluator, :polymorphic => true 
    belongs_to :evaluatable, :polymorphic => true 

Mam również obawy o evaluator i evaluatable jak:

module Evaluator 
    extend ActiveSupport::Concern 

    included do 
     has_many :given_evaluations, as: :evaluator, dependent: :destroy, class_name: 'Evaluation' 

    end 
end 

module Evaluatable 
    extend ActiveSupport::Concern 

    included do 
     has_many :received_evaluations, as: :evaluatable, dependent: :destroy, class_name: 'Evaluation' 
    end 
end 

mam włączone każdy niepokój w moim modelu użytkownika:

class User < ActiveRecord::Base 
    include Evaluator 
    include Evaluatable 

W mojej stronie show, Chcę pokazywać oceny poszczególnych użytkowników (otrzymywane od innych użytkowników, którzy są osobami oceniającymi).

W moim programie mam.

<% Evaluation.find(params[:id]).evaluations.order('created_at DESC').each do |eval| %> 
           <div id="portfolioFiltering" class="masonry-wrapper row"> 
             <%= eval.remark %> 
             <%= eval.personal_score %> 
             <small><%= eval.created_at %></small> 

W moim ocenach postaci, I "nie wiem, jak do wyznaczenia odbiorcy oceny zrobiłem podstawową formę, ale nie jestem jasne . o tym, jak związać go do użytkownika, który powinien otrzymać ocenę

<%= simple_form_for(@evaluation) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
    <%= f.input :score, collection: 1..10, autofocus: true, :label => "How do you rate this experience (1 being did not meet expectations - 10 being met all expectations) ?" %> 

    <%= f.input :remark, as: :text, :label => "Evaluate your project experience", :input_html => {:rows => 10} %> 

Moja tabela ma ocen:

t.integer "user_id" 
    t.integer "evaluatable_id" 
    t.string "evaluatable_type" 
    t.integer "overall_score" 
    t.integer "project_score" 
    t.integer "personal_score" 
    t.text  "remark" 
    t.boolean "work_again?" 
    t.boolean "continue_project?" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
    end 

    add_index "evaluations", ["evaluatable_type", "evaluatable_id"], name: "index_evaluations_on_evaluatable_type_and_evaluatable_id", unique: true, using: :btree 

PYTANIA

Jak skonfigurować stronę pokazu, aby wyświetlić oceny użytkowników?

Jak dostosować formularz tak, aby określał on identyfikator użytkownika jako osobę, która powinna otrzymać ocenę?

+0

Świetne pytanie i jesteś dobry w wyjaśnianiu swoich problemów .. pozwala zobaczyć, czy ktoś pomaga – illusionist

+0

Czy zamierzasz używać "Oceny" do oceny obiektów innych niż użytkownicy? Opierając się na odpowiedzi, odpowiedź można uprościć. –

+0

Tak. chcę ocenić projekty, które użytkownicy robią – Mel

Odpowiedz

2

Jak skonfigurować stronę pokazu, aby wyświetlić oceny użytkowników?

Obawy dotyczące Twojego modelu powinny Ci w tym pomóc. W swoim działaniu UsersController#show, wystarczy dodanie następujących powinno załatwić sprawę:

@received_evaluations = @user.received_evaluations 

Następnie można użyć go w szablonie Pokaż:

<% @received_evaluations.each do |evaluation| %> 
    // render some view stuff 
<% end %> 

Albo użyć collection rendering.

uwaga: Evaluation.find(...), który jest obecnie w widoku powinien zostać umieszczony w akcji kontrolera, nie jest dobrą praktyką pozostawienie go w widoku.

Jak dostosować formularz tak, aby określał identyfikator użytkownika jako osobę, która powinna otrzymać ocenę?

Jeśli zidentyfikowałeś użytkownika, który będzie służyć jako evaluatable, możesz ustawić go w akcji kontrolera lub w formularzu widoku, jeśli masz listę użytkowników do oceny na twojej stronie.

W regulatorze:

@evaluation.evaluatable_id = user_to_evaluate.id 
@evaluation.evaluatable_type = user_to_evaluate.class.to_s 

Albo to prostsze stwierdzenie powinno zrobić to samo:

@evaluation.evaluatable = user_to_evaluate 

Podobnie powinno być w stanie ustawić oceniającego w ten sam sposób:

@evaluation.evaluator = user_that_evaluates 

W widoku:

<% @users_to_evaluate.each do |user| %> 
    <%= simple_form_for(Evaluation.new) do |f| %> 
    <%= f.error_notification %> 

    <div class="form-inputs"> 
     <%= f.input :score, collection: 1..10, autofocus: true, :label => "How do you rate this experience (1 being did not meet expectations - 10 being met all expectations) ?" %> 
     <%= f.input :remark, as: :text, :label => "Evaluate your project experience", :input_html => {:rows => 10} %> 
     <%= f.hidden_field :evaluator_id, :value => current_user.id %> 
     <%= f.hidden_field :evaluator_type, :value => current_user.class.to_s %> 
     <%= f.hidden_field :evaluatable_id, :value => user.id %> 
     <%= f.hidden_field :evaluatable_type, :value => user.class.to_s %> 
    </div> 
    <% end %> 
<% end %> 
+0

w porządku !! Bardzo dziękuję Marc. Spróbuję dziś wieczorem. – Mel