2

学校向けのレビューアプリケーションを作成しています。ユーザーは、ログインしている場合にのみ学校を確認できます。

あなたが今できること:

レビューを書いて、1〜5の評価を追加できます。アプリケーションはレビューを保存します。

私がしたいこと:

ログに記録されたuser_idを保存したいと思います。したがって、レビューはユーザーと学校に属します。

しかし、私はそれを行う方法について少し混乱しています。どんなアイデアやガイドラインも大歓迎です=)

レビューモデル:

class Review < ActiveRecord::Base
  belongs_to :school
  belongs_to :user
  attr_accessible :content, :rating
end

学校モデル:

class School < ActiveRecord::Base
  has_many :reviews
  ..more code..
end

ユーザーモデル:

class User < ActiveRecord::Base  
  has_many :reviews
  ...more code..
end

レビューコントローラー:

class ReviewsController < ApplicationController
    def create
        @school = School.find(params[:school_id])
        @review = @school.reviews.create!(params[:review])
        redirect_to @review.school, notice: "Review has been created."
    end
end

レビューフォーム

<%= form_for [@school, Review.new] do |f| %>
        <h3>Write a review</h3>
        <div class="reviews_comments_container">
            <div class="review_box">
                <ol class="radio-rater">
                    <%= f.radio_button(:rating, 1) %>
                    <%= f.radio_button(:rating, 2) %>
                    <%= f.radio_button(:rating, 3) %>
                    <%= f.radio_button(:rating, 4) %>
                    <%= f.radio_button(:rating, 5) %>
                </ol>
            </div>
            <div class="review_box" id="review_textarea">
                <%= f.text_area :content, rows: 4, cols: 70 %>
            </div>
            <div class="review_box">
                <%= f.submit 'Save your review', :class => "btn" %>
            </div>
        </div>
    <% end %>

移行ファイル:

class CreateReviews < ActiveRecord::Migration
  def change
    create_table :reviews do |t|
      t.text :content
      t.integer :rating
      t.belongs_to :school
      t.belongs_to :user
      t.timestamps
    end
    add_index :reviews, [:school_id, :user_id]
  end
end
4

2 に答える 2

0

Deviseを使用してユーザーを認証している場合、current_userはオブジェクトであり、認証後に返されます。あなたのReviewsControllerで:

class ReviewsController < ApplicationController
  def create
    @school = School.find(params[:school_id])

    @review = @school.reviews.build(params[:review])
    @review.user_id = current_user

      if @review.save
    redirect_to @review.school, notice: "Review has been created."
       end
  end
end

テーブル'reviews'にuser_idという名前の新しい列を含める必要がある場合は、新しい移行を作成してから' rake db:migrate'を作成する必要があります。(移行に応じて、この列があるようです)。

編集:ネストされたリソースのルート:

resources :schools do
  resources :reviews do
end
于 2012-11-30T23:32:47.400 に答える
0

これを行うには、いくつかの異なる方法があります。アソシエーションが適切に設定されているので、それはコントローラーに委ねられます。あなた:school_idはあなたのcreate電話をした方法のためにすでに設定されています:

@review = @school.reviews.create!(params[:review])

:user_id手動で設定できます。

params[:review][:user_id] = current_user.id
@review = @school.reviews.create!(params[:review])

current_userこれは、かなり標準的なログインシステムのメソッドがあることを前提としています。作成アクションは少し改善される可能性があります。次のようなものを試してください。

def create
    @school = School.find(params[:school_id])
    @review = @school.reviews.new(params[:review])

    #Assuming your authentication provides the current_user method
    @review.user_id = current_user.id

    if @review.save
        redirect_to @review.school, notice: "Review has been created."
    else
        render :new
    end
end

これには、検証が失敗した場合、または何らかの理由でレコードをデータベースに保存できない場合に、エラー処理をより適切に制御できるという追加の利点があります。newまた、の中にアクションが必要です。これにより、次のreviews_controllerようになります。

class ReviewsController < ApplicationController
    def new
        @school = School.find_by_id(params[:school_id])
        @review = Review.new
    end

    def create
        @school = School.find(params[:school_id])
        @review = @school.reviews.new(params[:review])

        #Assuming your authentication provides the current_user method
        @review.user_id = current_user.id

        if @review.save
            redirect_to @review.school, notice: "Review has been created."
        else
            render :new
        end
    end
end

そうすれば、通話で通話をにform_for変更できます。これははるかに優れています。Review.new@review

アップデート:

すみません、私の間違いです。このSOの答えが示すようReview.newに、form_forタグを入れてもかまいません。それは私にはちょっとハッキーに思えましたが、私はいくつかの場所でそれを確認しました。

于 2012-11-30T23:48:19.850 に答える