1

我使用它来允许用户对条目进行投票:

 <% form_tag url_for(entry_votes_path(@entry)), :id => 'voting_form', :remote => true do %>
      <%= hidden_field_tag 'vote[user_id]', current_user.id  %>
      <%= submit_tag 'Vote for this entry', :id => 'voting_button' %>
 <% end %>

这是我的控制器代码:

def create
    @entry = Entry.find(params[:entry_id])
    @vote = @entry.votes.build(params[:vote])

    respond_to do |format|
    if @vote.save
        format.html { redirect_to @entry }
        format.js
      end
    end
  end

我有两个问题

  1. 如何在current_user.id不使用隐藏字段的情况下进行分配?

  2. 另外,我现在没有使用attr_accessibleattr_protected使用 Vote 模型。我应该如何保护模型以确保有人不能创造很多选票?现在,Vote 模型中的所有字段都由params哈希设置——我应该使用attr_protectedentry_id键,然后在控制器中单独设置它吗?

4

1 回答 1

2

我现在没有在投票模型上使用 attr_accessible 或 attr_protected ......

然后,根据定义,可以从查询字符串进行批量分配。

我应该在 entry_id 外键上使用 attr_protected,然后在控制器中单独设置它吗?

一般来说,使用 attr_accessible 比使用 attr_protected 更好。这是因为 attr_accessible 为批量分配建立了默认拒绝全部并允许您定义列入白名单的例外。另一方面, attr_protected 强制您将特定属性列入黑名单。当您修改程序并添加设置了 attr_accessible 的新属性时,如果您需要将该属性列入白名单并忘记,程序将失败。换句话说,它安全地失败了。或者,如果您添加一个设置了 attr_protected 的新属性,即使该新属性本应包含在 blacklist 中,程序也会运行。换句话说,它不安全地失败了。

这里的规则是保护任何允许从查询字符串中设置的危险属性。保护密钥有助于防止注入新行,但如果您想阻止更改现有行内容的能力,则可能需要保护其他字段。

可以在guides.rubyonrails.org找到一个很好的参考。

于 2011-02-01T05:26:15.313 回答