0

Rails 3 を使用しています。attr_accessible :rating, :review, :user当然、 を宣言する必要はありませんが、そうしないと、レビュー フォームはエラー を返しますCan't mass-assign protected attributes error :rating, :review, :user:userセキュリティ上の理由から、全体を公開したくありません。私は何を間違えましたか?

# review.rb

class Review < ActiveRecord::Base
  belongs_to :reviewable, :polymorphic => true, :counter_cache => true
  belongs_to :user, :counter_cache => true

  attr_accessible :rating, :review, :user

  validates :review, :presence => true, :length => { :minimum => 2, :maximum => 500 }
  validates :rating, :inclusion => { :in => ApplicationConstants::RATINGS.collect(&:first) }  
end

# reviews_controller.rb

class ReviewsController < ApplicationController
  before_filter :find_reviewable

  def create
    @review = @reviewable.reviews.new(params[:review].merge(:user => current_user))
    if @review.save
      flash[:success] = 'Thanks for adding your review.'
      redirect_to @reviewable
    else
      flash[:error] = 'Error, try again.'
      redirect_to @reviewable
    end
  end

  ...

  private

  def find_reviewable
    resource, id = request.path.split('/')[1, 2]
    @reviewable = resource.singularize.classify.constantize.find(id)
  end
end

# user.rb

class User < ActiveRecord::Base
  has_many :reviews, :as => :reviewable
end

# reviews/_form.html.erb

<%= form_for [@reviewable, @review] do |f| %>
  <div id="rating_buttons" class="btn-group" data-toggle-name="review[rating]" data-toggle="buttons-radio">
    <% ApplicationConstants::RATINGS.each do |rating| %>
      <button type="button" class="btn<%= active(@review.rating, rating[0]) %>" value="<%= rating[0] %>"><%= rating[1] %></button>
    <% end %>
  </div>
  <%= f.hidden_field :rating %>
  <%= f.text_area :review, :class => 'input-xxlarge', :rows => '3' %><br>
  <%= f.submit 'Submit', :class => 'btn btn-primary' %>
<% end %>
4

3 に答える 3

0

assert_attributesを使用 して、属性のハッシュを渡すことにより、特定の一括割り当てセキュリティロールのすべての属性を設定します

user = User.new
user.assign_attributes({ :name => 'Josh', :is_admin => true })
于 2012-09-15T18:07:59.000 に答える
0

:rating と :review にアクセスできるようにする必要があります。なぜユーザーをアクセス可能にする必要があるのですか? 単にユーザーのレビューを保存しようとしている場合 (もちろん、サインインしている場合)、コントローラーからユーザーの ID を渡すことができます。これは create メソッドで行ったことがわかります。

他に達成しようとしていることがあれば、お知らせください。

于 2012-09-15T17:07:27.007 に答える
0

this questionを参照して、次を発行して修正しました。

class ReviewsController < ApplicationController
  ...

  def create
    @review = @reviewable.reviews.new(params[:review])
    @review.user_id = current_user.id
    ...
  end
end

これにより、userモデルを大量割り当て可能として宣言する必要がなくなります。

于 2012-09-16T12:17:44.463 に答える