我用它来允许用户对条目进行投票:
<% 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
我有两个问题
如何在不使用隐藏字段的情况下指定current_user.id
?
此外,我现在没有在投票模型上使用attr_accessible
或attr_protected
。我该如何保护模型以确保某人无法创造大量选票?现在,投票模型中的所有字段都由params
哈希设置 - 我应该使用attr_protected
,entry_id
外键,然后在控制器中单独设置它?
答案 0 :(得分:2)
我没有使用attr_accessible 或者在投票模型上使用attr_protected 现在......
然后,根据定义,可以从查询字符串中进行质量分配。
我应该使用attr_protected吗, entry_id外键然后设置 它分别在控制器中?
通常,使用attr_accessible比使用attr_protected更好。这是因为attr_accessible建立了deny-all默认的质量分配,并允许您定义列入白名单的例外。另一方面,attr_protected强制您将特定属性列入黑名单。当您修改程序并使用attr_accessible set添加新属性时,如果您需要将属性列入白名单并忘记,程序将失败。换句话说,它安全失败。或者,如果使用attr_protected set添加新属性,即使新属性应包含在黑名单中,该程序仍将工作。换句话说,它不安全地失败了。
这里的规则是保护允许从查询字符串设置的任何属性。保护密钥有助于防止注入新行,但如果您想要阻止更改现有行的内容,则可能需要保护其他字段。
可以在guides.rubyonrails.org找到关于此的一个很好的参考。