2014-02-25 47 views
0

我正在使用Embedded RubyRails 4來創建和編輯用戶。每個用戶都必須在創建時分配一個角色。最初,表單使用複選框,並且工作正常。然而,當切換到單選按鈕時,我收到一個錯誤。ERB導致字符串錯誤的單選按鈕

這是形式:

<%= simple_form_for(@user, html: {class: 'form-horizontal'}) do |f| %> 
<%= f.error_notification %> 

<div class="form-inputs"> 
    <%= f.input :name, autofocus: true %> 
    <%= f.input :email %> 
    <%= f.input :phone_number %> 

    <%= f.input :institution_pid, collection: institutions_for_select, as: :select, label: "Institution" %> 

    <%= f.association :roles, collection: roles_for_select, as: :radio_buttons %> 

    <%= f.input :password %> 
    <%= f.input :password_confirmation %> 

</div> 
<br> 
<div class="form-actions"> 
    <%= button_tag(type: 'submit', class: "btn doc-action-btn btn-success") do %> 
     <i class="glyphicon glyphicon-check"></i> Submit 
    <% end %> 
    <%= link_to @user, {class: "btn doc-action-btn btn-cancel"} do %> 
     <i class="glyphicon glyphicon-remove"></i> Cancel 
    <% end %> 
</div> 

我專門問了f.association位。之前,當我使用

as: :check_boxes 

它的工作原理與它應該完全相同。現在我收到此錯誤消息:

NoMethodError in UsersController#update 

undefined method `reject' for "77":String 

我應該注意「77」是單選按鈕選項之一的值。

的方法引發錯誤是這樣的:

def build_role_ids 
    [].tap do |role_ids| 
    roles = Role.find(params[:user][:role_ids].reject &:blank?) 
    roles.each do |role| 
     authorize!(:add_user, role) 
     role_ids << role.id 
    end 
    end 
end 

使用單選按鈕時,HTML看起來像這樣:

<label class="radio"> 
    <input class="radio_buttons optional" id="user_role_ids_77" name="user[role_ids]" type="radio" value="77"> 
    "Institutional Admin" 
</label> 

使用複選框:

<label class="checkbox"> 
    <input class="check_boxes optional" id="user_role_ids_77" name="user[role_ids][]" type="checkbox" value="77"> 
    "Institutional Admin" 
</label> 

如果我錯過了一些東西,或者你需要更多的信息,請讓我知道。謝謝!

回答

0

有了複選框,用戶可以選擇多個值,因此您得到params[:user][:role_ids]中返回的Array的role_id。 reject方法是爲數組實現的。因此,它在那種情況下起作用。

使用單選按鈕,每次只能選擇一個值,因此您將在params[:user][:role_ids]中獲得role_idsString值。字符串沒有實現reject方法。因此,錯誤。

而不是

params[:user][:role_ids].reject &:blank? 

您可以檢查是否role_ids是空的或不是,因爲它是一個String對象。

params[:user][:role_ids].empty? 

和更新記build_role_ids方法保持其role_ids是字符串對象,並不是數組。

+0

我不得不做更多一點的方法編輯,而不僅僅是從數組更改爲字符串,但一般想法的工作。謝謝! – user3254621

0

此錯誤似乎表明params[:user][:role_ids]不是Array而是單個String值。這是有意義的,因爲你從複選框(一次可以選擇多個值= Array)改變爲單選按鈕(每次只能選擇一個值= String)。

如果您真的想從複選框更改爲單選按鈕,那麼您需要更新您的方法邏輯,以期望得到一個值而不是一組值。