表单无法保存一个属性

时间:2015-01-22 03:43:06

标签: ruby-on-rails forms foreign-keys

我有一个保存除一个属性以外的所有表单。 :user_id(外键)持续出现为nil。这是一个用于创建新评论的表单,它位于我的印象#show文件中,因此可能是问题的一部分;但其他属性(:name和:impression_id)似乎保存得很好。

以下表格:

= form_for @comment do |f|
   = f.label 'Add Comment'
   %br
   = f.text_area :body, placeholder: 'Comment', cols: 50, rows: 3
   %br
   = f.hidden_field :impression_id, :value => @impression.id
   = f.hidden_field :user_id, :value => current_user.id
   %br
   = f.submit "Save"

impressions_controller的相关部分是:

 def show
   @impression = Impression.find(params[:id])
   @play = Play.find_by(id: @impression.production.play_id)
   @production = Production.find_by(id: @impression.production_id)
   @comments = Comment.where(impression_id: @impression.id)
   @comment = Comment.new
 end

在comments_controller中,我有以下内容:

def new
  @impression = Impression.find(params[:impression_id])
  @comment = Comment.new(comment_params)
  authorize @comment
end

def create
  @comment = Comment.new(comment_params)
  authorize @comment
  if @comment.save
    flash[:notice] = 'You have successfully added a comment.'
    redirect_to :back
  else
    flash[:notice] = 'Please try again.'
    render :new
  end
end

private

def comment_params
  params.require(:comment).permit(:body, :impression_id, :user_id)
end

正如您所看到的,我尝试为user_id分配:current_user.id的值,但它并没有。谁能看到我失踪的东西?

我已经尝试将comments_params添加到我的展示控制器中,但是我收到一条错误消息,指出param注释为空。 。

谢谢!

3 个答案:

答案 0 :(得分:0)

首先检查 current_user ,如果current_user的值正常,则必须在评论表中保存user_id。

答案 1 :(得分:0)

如果您的用户未登录,则current_user为nil。 确保您的用户已登录

答案 2 :(得分:0)

回答你的问题...

也许你的隐藏字段没有在评论subhash中发送user_id。检查你的参数,看看。您的comment_params方法希望它位于注释subhash中。

你如何查看这些参数?

在每个表单提交后查看rails控制台,或者 如果您使用的是rails 4.2,请在...中查看https://gorails.com/episodes/rails-4-2-introduction大约4分钟,

...或

在你的gemfile中,放

group :development do
  gem 'better_errors'
  gem 'binding_of_caller'
end

捆绑(在您的终端中),重启您的rails服务器

然后在您的控制器代码中,在current_user应该存在的行中,键入行raise "oops",运行代码,获取错误,然后转到http://localhost:3000/__better_errors以查看您的控制台

这将为您提供一个带控制台的错误页面,您可以在其中键入任何变量名称(params,current_user等)并检查其值。