我有一个模型Note
,其属性为subject
和content
,问题是在创建新笔记时,内容会变为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 %>
答案 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]">