隐藏字段不更新rails应用程序中的sqlite表

时间:2015-01-21 20:18:44

标签: ruby-on-rails sqlite

我是一个带有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,那么它可以正常工作。

提前致谢

1 个答案:

答案 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,我的id5,而另一位用户的id7。如果我手动将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