将实例变量从模型传递到视图

时间:2016-11-27 21:23:49

标签: ruby-on-rails ruby

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>

如果有人知道答案并且可以与我和世界其他地方分享,我会非常感激!谢谢!

2 个答案:

答案 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

READ NORE ABOUT ENUMs