2016-11-27 69 views
1

你好(希望)無所不知Rails的人;)傳遞一個實例變量從模型到視圖

我目前正在試圖生成一個實例變量一組單選按鈕在我的車型之一。由於MVC模式禁止將模型中的數據直接傳遞到視圖中,因此我不得不將控制器作爲一種中間人。問題是我無法訪問我的模型的實例變量,即使我使用'attr_reader:valid_statuses'。因此,也不可能將數據傳遞給我的視圖...

這就是我目前的用戶模型。 '@valid_statuses'數組包含應該用於生成單選按鈕的字符串。

class User < ApplicationRecord 
    attr_reader :valid_statuses 
    @valid_statuses = %w(new editor admin blocked) 
    validates :status, inclusion: { in: @valid_statuses } 
end 

控制器看起來像這樣。 @user不是nil,但@valid_statuses是

class UsersController < ApplicationController 
    ... 
    def set_user 
    @user = User.find(params[:id]) 
    @valid_statuses = @user.valid_statuses 
    end 
    ... 
end 

的_form.html.erb:

<div class="field"> 
    <%= f.label :status %> 
    <% @valid_statuses.each do |item| %> 
    <%= f.radio_button :status, item %> <%= item %><br /> 
    <% end %> 
</div> 

如果有人知道這個問題的答案,並能與我分享它,我會很greateful剩下的世界!謝謝!

回答

1

在這種情況下,你必須使用常量(如果你想只解決您的代碼):

型號:

class User < ApplicationRecord 
    VALID_STATUSES = %w(new editor admin blocked) 
    validates :status, inclusion: { in: VALID_STATUSES } 
end 

控制器:

class UsersController < ApplicationController 
    ... 
    def set_user 
    @user = User.find(params[:id]) 
    end 
    ... 
end 

觀點:

<div class="field"> 
    <%= f.label :status %> 
    <% User::VALID_STATUSES.each do |item| %> 
    <%= f.radio_button :status, item %> <%= item %><br /> 
    <% end %> 
</div> 

但我最好還是使用enum與名status

型號:

class User < ApplicationRecord 
    enum status: [:new, :editor, :admin, :blocked] 
end 

READ NORE ABOUT ENUMs

+0

謝謝奧列格。我會看看枚舉! – krebas

+0

@ krebas是的,不錯的選擇。 'enum's有很多利潤和語法糖 –

1

有效狀態不會從一個用戶更改爲另一個用戶。

因此您在類User中定義了@valid_statuses@valid_statuses未針對特定@user定義,而是針對整個班級。 attr_reader :valid_statuses試圖找到尚未定義的@user的實例變量@valid_statuses

這裏是一個可能的修改:

​​

,並在您的觀點:

User.valid_statuses 
+0

我建議使用類實例變量而不是類變量-so「@ valid_statuses'而不是'@@ valid_statuses' – ReggieB

+1

完全正確。我已經改變了它。 –

相關問題