我是一个带有rails的菜鸟我无法理解为什么我在表单中的隐藏字段没有在表中更新。我的表格如下:
<%= form_for(@cricket_club_advert) do |f| %>
<% current_user_id = current_user.id %>
<%= hidden_field_tag "user_id", current_user_id %>
<% if @cricket_club_advert.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@cricket_club_advert.errors.count, "error") %> prohibited this cricket_club_advert from being saved:</h2>
<ul>
<% @cricket_club_advert.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="row">
<div class="large-6 columns">
<%= f.label "Title" %>
<%= f.text_field :title %>
</div>
</div>
<div class="row">
<div class="large-6 columns">
<%= f.label "Type of Player Required" %>
<%= f.text_field :player_type %>
</div>
</div>
我已将字段user_id添加到已接受的参数中,这可以在这里看到:
def cricket_club_advert_params
params[:cricket_club_advert].permit(:user_id, :title, :player_type, :description, :airfares, :accomadation, :job, :incentives)
end
但是,当我创建或编辑新记录时,该字段不会更新,也不会创建错误。
如果我在表单中创建一个带有id user_id的text_field,那么它可以正常工作。
提前致谢
答案 0 :(得分:0)
解决错误
错误在于您使用的是form_for
,而是调用hidden_field_tag
而不是f.hidden_field
,表单正在发送:user_id
,而不是[:cricket_club_advert][:user_id]
。
只需改变:
<%= hidden_field_tag "user_id", current_user_id %>
有关:
<%= f.hidden_field :user_id, current_user_id %>
推荐(重要)
您处理user_id
价值的方式是在您的应用上打开漏洞。如果我从浏览器手动更改hidden_input
的价值,我可以在我的帐户中以您应用的任何其他用户的名义创建cricket_club_advert
。
示例强>
让我们说我是current_user,我的id
是5
,而另一位用户的id
为7
。如果我手动将hidden_input的值从5
(current_user id)更改为7
(其他用户ID),您的应用将为其他用户创建cricket_club_advert
我手动指定。
您应该在控制器上移动user_id
值,而不是在表单中。像这样:
# I assume an user has_many :cricket_club_adverts
def create
cricket_club_advert = current_user.cricket_club_adverts.build(ricket_club_advert_params)
if cricket_club_advert.save
# ...
else
# ...
end
end
这样您就可以确保用户只能以他的名字创建cricket_club_advert
。