2013-06-22 52 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