2013-06-22 99 views
0

我正在使用devise进行身份验证,并让用户与建筑物关联。我可以创建与正确建筑物适当关联的新用户,但如果新用户没有全部所需的输入,则可以设计验证中断。Simple_form隐藏字段中断在rails 3.2中设计验证应用程序

代码:

应用程序/模型/ user.rb

class User < ActiveRecord::Base 
    belongs_to :building 
    attr_accessible :building_id 
    ... 
end 

(我知道,已经building_id attr_accessible是不理想,但我不知道如何建立关联,而不使用隐藏场在新用户注册表单的building_id ...)

class Building < ActiveRecord::Base 
    has_many :users 
    ... 
end 

在我的路线,用户注册嵌套在建筑物内:

devise_for :users, controllers: { :registrations => "registrations" }, skip: [:registrations] 

resources :users, except: [:new, :create] do 
    resource :approvals, only: [:update] 
end 

match '/:building', to: "buildings#landing" 
resources :buildings, except: [:new, :create, :destroy] do 
    as :user do 
    get '/signup' => 'registrations#new', as: :new_user_registration 
    post '/signup' => 'registrations#create', as: :user_registration 
    end 
    ... 
end 

应用/视图/设计/注册/ new.html.erb

<%= simple_form_for(resource, :as => resource_name, :url => building_user_registration_path(), :html => {:class => 'form-inline', :multipart => true }) do |f| %> 

    <%= render 'fields', f: f %> 

    <div class="inputs"> 
    <%= f.input :role, collection: User::ROLES.collect %> 
    <%= f.input :password, :required => true %> 
    <%= f.input :password_confirmation, :required => true %> 
    </div> 

    <div class="actions"> 
    <%= f.button :submit, "Create my account", class: "btn btn-large btn-primary" %> 
    </div> 
<% end %> 

然后,最后,在应用程序/视图/设计/注册/ _fields.html.erb代码有问题的行

... 
<%= f.hidden_field :building_id, value: @building.id %> 
... 

如果新用户的所有必填字段被正确填写,则会创建一个与正确的建筑物适当关联的新用户。如果有任何必填字段为空或无效,设计引发以下错误在浏览器中:

RuntimeError in Registrations#create 

Showing .../app/views/devise/registrations/_fields.html.erb where line #7 raised: 

Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id 

线#7:<%= f.hidden_field :building_id, value: @building.id %>

任何想法,将不胜感激。我敢肯定,我在这里做一些事情不理想......

+0

我不太明白你的意思。如果用户没有输入正确的信息,验证失败是否会达到预期的效果? –

+0

我听说你,@BillyChan。更清楚的是,“成功的验证失败”;-)没有第7行#7用“请更正下面的问题:”和空白的必填字段高亮显示表单。包含该行#7和无效输入,我得到一个“Action Controller:Exception caught”的错误页面,其中包含上述错误。 – BenU

+0

“被调用的ID为零”意味着“@ building”为零。该对象是否真正设置并在控制器中有效? –

回答

0

我不想在所有包含这个字段在朋友的帮助下开展工作。我已经有一个自定义登记控制器(在我的路线简称),我添加了一个过滤器之前找到建筑:

class RegistrationsController < Devise::RegistrationsController 

    before_filter :find_building, only: [:new, :create] 

    ... 

    private 

    def find_building 
    @building = Building.find_by_slug(params[:building_id]) 
    end 

end 
2

你可以做

<%= f.hidden_field :building_id, value: @building.try(:id) %> 

但我想如果没有@building设置

+0

感谢您的建议,@MichaelSzyndel。您的代码不会生成错误,并允许使用设计警告“请检查以下问题:”重新呈现新的用户注册表单。但它不会填充building_id字段。不知何故,我必须设置@建设。我只是试过'<%= f.hidden_​​field:building_id,value:Building.find(params [:building_id])%>'但这也行不通。 – BenU

+0

您是否对User#building有验证? –

+0

感谢您的见解,@MichaelSzyndel。我确实在user.building_id上进行了验证。它必须在场。我确实得到了这个工作 - 请参阅下面的答案。 – BenU