验证来自不同模型的值

时间:2013-06-03 17:35:56

标签: ruby-on-rails ruby validation ruby-on-rails-3.2 ruby-1.8.7

我是Rails的新手,所以我有一个新手问题。

我们有一个表单,允许管理员设置一个如下所示的新用户:

<%= form_for :user, :url => url_for(:action => 'create_user', :account_id => @account.id, :hide_form => 1), :html => {:name => 'new_user_form', :id => 'new_user_form', :remote => true} do |f| %>
  First Name:
  <% f.text_field 'first_name' %><br/>
  Last Name:
  <%= f.text_field 'last_name' %><br/>
  Username:
  <%= f.text_field 'login' %><br/>
  Email:
  <%= f.text_field 'email' %><br/>
  Agency Code:
  <%= text_field_tag 'agency_code', @default_agency_code %><br/>

  <div class="button-bar">
    <%= f.submit :id => "submit_button" %>
  </div>
<% end %>

到目前为止,这么好。提交表单时调用的操作将所有表单值推送到User对象并将其保存到数据库中:

def remote_create_user
  @user = User.new(params[:user])
  @user.agency = Agency.find{|agency| agency.product_code == params[:agency_code]}
  if @user.valid? and @user.save
    # Move some stuff around for the new user
  else
    @error = "Failure to Save:"
    @user.errors.full_messages.each {|msg| @error += " - #{msg}"}
  end
end

我的理解是,视图中以<%= form_for :user开头的行让ERB视图知道使用{中指定的验证逻辑验证直接对应User类的所有表单字段。 {1}}模型。

但是,表单中的最后一个字段(User)与Agency Code: <%= text_field_tag 'agency_code', @default_agency_code %><br/>模型中的属性不对应。相反,它与User对应。 Agency.product_code模型定义了此属性的验证。如何告诉Rails在Agency模型中使用此字段的验证逻辑?如果没有办法直接执行此操作,如何将验证直接添加到代理商代码文本字段?

1 个答案:

答案 0 :(得分:1)

您只需使用

即可
@user.agency = Agency.find_by_id{|agency| agency.product_code == params[:agency_code]}

并在您的用户模型中

validates :agency_id, :presence => true

find_by_id在这种情况下效果会比简单find更好,因为如果找不到模型,它会返回nil