模型内容未保存

时间:2015-07-19 16:01:31

标签: ruby-on-rails

我有一个模型Note,其属性为subjectcontent,问题是在创建新笔记时,内容会变为nil

模型/ notes.rb

belongs_to :user

scope :english, lambda { where("note.subject = ?",  "english") }
scope :math, lambda { where("note.subject = ?",  "math") }

控制器/ notes.rb

def new
  @note = current_user.notes.new
  respond_with(@note)
end

def create
  @note = current_user.notes.new(note_params)
  @note.save
  redirect_to user_note_path(current_user.id, @note)
end

private
 def set_note
   @note = current_user.notes.find(params[:id])
 end

 def note_params
  params.permit(:content, :subject, :user_id)
 end

提交/注释/新表格后的参数

 Parameters: {.."note"=>{"content"=>"new note"}, "subject"=>"english", "commit"=>"Submit", "user_id"=>"1"}

笔记/ _form.html.erb

<%= form_for([current_user, @note]) do |f| %>

    <%= f.label :content %>
    <%= f.text_area :content %>

    <%= f.label :subject %>
    <%= select_tag(:subject, options_for_select(["english", "math"])) %>

    <%= f.submit "Submit"%>

<% end %>

2 个答案:

答案 0 :(得分:4)

您需要纠正note_params这样的功能:

def note_params
  params.require(:note).permit(:content, :subject, :user_id)
end

编辑:

您只是使用select_tag;这样,此数据就无法与note中的params相关联。您需要f.select_tag作为快速解决方案。

但如果您坚持使用select_tag,则需要按以下方式在代码中添加note

<%= select_tag('note[subject]', options_for_select(["english" ,"math"])) %>

答案 1 :(得分:2)

默认情况下,使用<!--your html form goes here--> <?php //all php code goes in here ?> form_builder将&#34;命名空间&#34; form_for(@object)下的所有字段,这就是建议您使用object的原因,以便选择所有以params.require(:note)命名的字段

换句话说,

之间存在差异
:note

<%= f.select(:subject, options_for_select(["english", "math"])) <%= select_tag(:subject, options_for_select(["english", "math"])) %>

下使用f.something命名空间

使用:user将不会命名空间

因此,要使用最佳实践完全修复代码,您应该使用

something_tag

在您的表单中

<%= f.select(:subject, options_for_select(["english", "math"]))
控制器中的

编辑:通过命名空间,我的意思是rails会生成这样的HTML标记:

params.require(:note).permit(:content, :subject, :user_id)

而不是

<input id="note_content" ... name="note[content]">