我是rails的新手。我有两个模型:Form和FormType.form_type可以有零个或一个form.A表单只属于一个form_type。为此我创建了如下模型:
class FormType < ActiveRecord::Base
has_one :form
attr_accessible :name
end
class Form < ActiveRecord::Base
belongs_to :form_type
validates :name, :presence => true
validates_presence_of :form_type
attr_accessible :name, :enabled
end
我的_form.html.erb如下
<%= simple_form_for(@form, :html => { :class => 'form-horizontal' },
:url => @form.new_record?() ? admin_forms_path : admin_form_path,
:method => @form.new_record?() ? 'post':'put' ) do |f| %>
<div class="form-inputs">
<%= f.input :name, :required => true, :autofocus => true %>
<%= f.association :form_type,:required => true, :hint => "select type" %>
<%= f.input :enabled %>
</div>
<div class="form-actions">
<%= f.button :submit, :class => 'btn-primary' %>
<% if ! @form.new_record?() %>
<%= link_to t('.destroy', :default => t("helpers.links.destroy")),
admin_form_path(@form),
:method => 'delete',
:confirm => t('.confirm', :default => t("helpers.links.confirm")),
:class => 'btn btn-danger' %>
<% end %>
</div>
<% end %>
这是我的控制器代码。
def create
@form = Form.new
@form.name = params[:form][:name]
@form.enabled = params[:form][:enabled]
@form.form_type_id = params[:form][:form_type_id].to_i
if @form.save
redirect_to :action => 'index'
else
render action: "new"
end
端
我能够看到为名称字段触发的服务器端条件但无法验证关联。任何人都可以指出我的错误或一些有用的文章来解决此问题。
答案 0 :(得分:0)
这很可能是因为您在create方法中分配属性的方式。你的方式并不是真正的标准。
特别是这一行可能是罪魁祸首,因为如果你没有传递一个值,它将为0,因为你通过调用.to_i来转换值。所以无论validated_presence_of:form_type变得无用:
@form.form_type_id = params[:form][:form_type_id].to_i
即/ nil.to_i
等于0
,它将通过您的验证
请尝试使用此创建方法:
def create
@form = Form.new(params[:form]) #mass assignment
if @form.save
redirect_to :action => 'index'
else
render action: "new"
end
end
在表单模型中,确保已将要允许批量分配的值列入白名单。在这种情况下 - attr_accessible :name, :enabled, :form_type_id
同样在你的html文件中的simple_form_for方法中取出以下内容,因为你复制了rails的功能 - 它已经知道根据{{1}是否更改请求并更正路由/发布的路由是不是新记录。
@form
看起来你有一个管理员命名空间(在管理员文件夹中) - 如果是这种情况,请改用:
:url => @form.new_record?() ? admin_forms_path : admin_form_path,
:method => @form.new_record?() ? 'post':'put'
此外,我对您的应用程序了解不多,但怀疑表单模型上的has_one:表单应该是has_many:表单?
希望有所帮助!