3

私は、専攻、キャリア、および学校との多形的な関連を持つネストされたレビューモデルを持っています。ユーザーには、ショーページでこれらの専攻、学校、キャリアを確認してもらいたいと思います。さらに、プロフィールページで行ったすべてのレビューを見てもらいたいです。

レビューを表示することはできますが、メジャー、学校、キャリア、またはプロフィールページでレビューが表示されたときにこれらのアクションを実行できるようにしたいため、レビューの追加、編集、削除に問題があります。

これが私のルートです:

resources :majors, :schools, :careers do 
  resources :reviews
end

これが私の協会です:

Major.rb、School.rb、Career.rb

has_many:reviews、as:reviewable

Review.rb

belongs_to :user
belongs_to :reviewable, polymorphic: true

User.rb

has_many:reviews

これが私のreviews_controller.rbです:

before_filter :reviewable

def index
  @reviews = @reviewable.reviews
  @major = Major.includes(:reviews => :user).find_by_slug(params[:id])
end

def show
  @review = @reviewable.reviews.find(params[:id])
end

def new
  @review = @reviewable.reviews.build
  @review.user = current_user
end

def edit
  @review = @reviewable.reviews.find(params[:id])
  raise(ActiveRecord::RecordNotFound, "Access Denied") if @review.user != current_user
end

def create
  @review = @reviewable.reviews.build(params[:review])
  @review.user = current_user
  @reviews = @reviewable.reviews
end

def destroy
  @review = @reviewable.reviews.find(params[:id])
  @review.destroy
  raise(ActiveRecord::RecordNotFound, "Access Denied") if @review.user != current_user
end

def reviewable
  @reviewable = if params[:major_id]
    Major.find_by_slug!(params[:major_id])
   elsif params[:school_id]
    School.find(params[:school_id])
   elsif params[:career_id]
    Career.find(params[:career_id])
  end
end

たとえば、メジャーのレビューを作成、表示、編集するために、メジャーショーページでレビューを行います。これは私がmajors_controller.rbに持っているものです:

def show
  @reviews = Review.includes(:user)
  @reviews_most_liked = Review.order("created_at DESC").limit(4)
end

メジャー、学校、キャリアショーのページ内のモーダルウィンドウから追加および編集できるようにしようとしています。これが私がモーダルウィンドウに持っているものです:

<%= simple_form_for([@reviewable, @review]) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :review %>
  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>
4

1 に答える 1

2

私はそれを考え出した。問題は、正しいインスタンス変数を正しいアクションとコントローラーにマッピングすることにありました。ほとんどのインスタンス変数は、majors_controller.rb、school_controller.rb、careers_controller.rb の show アクションに配置されました。これは私の majors_controller.rb show アクションの一部です- create アクションと delete アクションに誤って配置していました。しかし、座って考えてみると、すべてが番組ページ内で起こっていることに気付きました。私のモデルのコントローラーは次のようになります。

def show
    @reviewable = @major
    @reviews = @reviewable.reviews #show reviews
    @reviews_most_liked = @reviewable.reviews.order("created_at DESC").limit(2)
    @reviews_most_liked_2 = @reviewable.reviews.order("created_at DESC").limit(2).offset(2)
    @review = @reviewable.reviews.build(params[:review]) #create a review
    @review.user = current_user #connect the created review to the user
end

次に、専攻の show.html.erb ページで、レビューを行った人に電話して show メソッドを呼び出すことができました。

<%= review.user.profile_name %>

そしてレビュー自体:

<%= review.review %>

それはレビューを表示します。次に、作成、編集、および削除する必要がありました。作成するには、インスタンス変数を正しく取得する必要がありました。正しいコントローラーと正しいアクション (majors controller show アクション) の下でそれらを正しくしたら、majors show ページのモーダル ウィンドウで、フォームをパーシャルと呼びました。

 <%= render 'reviews/form' %>

次のようになります。

<%= simple_form_for([@reviewable, @review]) do |f| %>
  <%= f.error_notification %>
  <div class="form-inputs">
    <%= f.input :review, :input_html => { :class => "span4", :rows => 10 }, 
                         label: false, 
                 placeholder: 'Help others by sharing what you\'ve learned as a major.' %>
  </div>
  <div class="modal-footer">
    <button class="btn cancel-modal-review" data-dismiss="modal" aria-hidden="true">Cancel</button>
    <%= f.submit 'Share My Review', :class => "submit-feedback" %>
  </div>
<% end %>
于 2013-03-20T05:33:17.243 に答える