【问题标题】:Ruby on Rails: hidden field value not inserting into databaseRuby on Rails:隐藏字段值未插入数据库
【发布时间】:2014-02-15 23:47:50
【问题描述】:

我有两个 hidden_​​fields,user_idskill_id

<%= form_for @skill do |s| %>
  <%= s.label :image, "Upload your skill" %>
  <%= s.hidden_field :user_id, value: current_user.id %>
  <%= s.hidden_field :skill_id, value: params[:id] %>
  <%= s.file_field :image, multiple: true %>
<% end %>

在我的控制器中,我有这个:

def reviews
  @skill = Skill.new
end  

我能够将skill_id 的值放入我的数据库,但我无法从user_id 中获得值。在我的 Rails 控制台中,我看到 user_id 正在通过“技能”传递,但没有显示在我的数据库中。

Parameters: {"utf8"=&gt;"✓", "authenticity_token"=&gt;"5+wxS929uxtt..", "skill"=&gt;{"user_id"=&gt;"7", "skill_id"=&gt;"132", ...

我什至检查了&lt;%= current_user.id %&gt; 是否有任何价值,我就是这样。

也许有人可以指导我调试此问题的正确路径。

谢谢

【问题讨论】:

  • 您的 HTML 是否正确显示了用户 ID?生成的 HTML 中的表单字段是否正确命名?
  • 它在你的参数中显示为"user_id"=&gt;"",这就是它没有被传递到数据库的原因。
  • 您的user_id 是否设置在attr_accessible 中?另外我假设skill 属于user。为什么不在控制器中使用@skill=current_user.skills.new
  • @fotanus 是的,它的显示正确且显示值也
  • @KirtiThorat 抱歉,这是一个错字。当我检查时它显示一个值 id

标签: ruby-on-rails ruby ruby-on-rails-3 debugging ruby-on-rails-3.2


【解决方案1】:
<%= form_for @skill do |s| %>
   <%= s.label :image, "Upload your skill" %>
   <%= s.hidden_field :user_id, value: current_user.id %>
   <%= s.hidden_field :skill_id, value: params[:id] %>
   <%= s.file_field :image, multiple: true %>
<% end %>

这将转到创建操作

所以你真正想要的是更新一个现有的,因为你正在传递一个现有的技能 id

def reviews
  @skill = Skill.find params[:id]
end

现在您的表单可以使用它了

<%= form_for @skill do |s| %>
   <%= s.label :image, "Upload your skill" %>
   <%= s.hidden_field :user_id, value: current_user.id %>
   <%= s.file_field :image, multiple: true %>
<% end %>

现在是在您的控制器中执行更新操作。

def update
  @skill = Skill.find params[:id]
  @skill.update_attributes params[:skill]
  redirect_to root_path # redirect to somewhere
end

试试这个。

【讨论】:

  • 我认为你没有理解我的问题
  • 您的问题是您无法将 user_id 获取到数据库中。您可以通过上述方式获取 user_id,然后将其保存到您的@skill。你有这样的行吗 Skill.create params[:skill]
  • 不,我只有.new。如果我做 .create,那么我的其他字段不会被输入,除非我将它放入 create(params...)
  • 谢谢,这个和@Sean 的回答让我朝着正确的方向前进
  • 好的,我更新了我的答案以在数据库中保存某种形式
【解决方案2】:

您需要一个如下所示的创建控制器:

def create
  @skill = Skill.new(params[:skill])
  if @skill.save
    # Handle a successful save.
  else
    render 'new'
  end
end

您可能希望将def reviews 控制器的名称更改为def new,并将新路由添加到config/routes.rb

【讨论】:

  • 这实际上让我找到了正确的方向......谢谢
猜你喜欢
  • 2017-08-03
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多