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

有几种不同的方法可以做到这一点。您已经正确设置了关联,因此它归结为您的控制器。由于拨打电话的方式,您: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 回答
0

如果您使用 Devise 对用户进行身份验证,则 current_user 是对象,在身份验证后返回。在您的评论控制器中:

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 回答