Hello(希望)无所不知的Rails人员;)
我目前正在尝试从我的某个模型中的实例变量生成一组单选按钮。因为MVC模式禁止将模型中的数据直接传递到视图中,所以我不得不将控制器包含为中间人。问题是即使我使用了attr_reader:valid_statuses'我也无法访问模型的实例变量。因此,也无法将数据传递给我的观点...
这就是我的用户模型目前的样子。 ' @ valid_statuses' array包含应该用于生成单选按钮的字符串。
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>
如果有人知道答案并且可以与我和世界其他地方分享,我会非常感激!谢谢!
答案 0 :(得分:1)
有效状态不会从一个用户更改为另一个用户。
所以你在User类中定义@valid_statuses
。 @valid_statuses
未针对特定@user
定义,而是针对整个班级定义。 attr_reader :valid_statuses
尝试查找尚未定义的@valid_statuses
的实例变量@user
。
以下是可能的修改:
class User < ApplicationRecord
@valid_statuses = %w(new editor admin blocked)
validates :status, inclusion: { in: @valid_statuses }
def self.valid_statuses
@valid_statuses
end
end
并在您的观点中:
User.valid_statuses
答案 1 :(得分: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
的{{1}}:
模型:
status