Ruby on rails 演示者模式 我经常看到模式1最常用于Rails演示者。

Ruby on rails 演示者模式 我经常看到模式1最常用于Rails演示者。,ruby-on-rails,ruby,ruby-on-rails-5,presenter,Ruby On Rails,Ruby,Ruby On Rails 5,Presenter,1) 演示者为什么需要视图上下文 2) 在模式1和模式2之间,模式2似乎更容易,因为不需要用块包装整个代码。为什么不经常使用这个?使用这个有什么坏处吗?vs模式1 3) 对于模式3,为什么人们根本不使用这个模式 节目主持人 1) 演示者为什么需要视图上下文 视图上下文允许访问视图帮助,如链接到等。如果不包含必要的模块,您通常无法在演示者中访问这些帮助。例如,您可以执行以下操作: def deactivate_button view_context.link_to('Deactivate',

1) 演示者为什么需要视图上下文

2) 在模式1和模式2之间,模式2似乎更容易,因为不需要用块包装整个代码。为什么不经常使用这个?使用这个有什么坏处吗?vs模式1

3) 对于模式3,为什么人们根本不使用这个模式

节目主持人 1) 演示者为什么需要视图上下文

视图上下文允许访问视图帮助,如
链接到
等。如果不包含必要的模块,您通常无法在演示者中访问这些帮助。例如,您可以执行以下操作:

def deactivate_button
   view_context.link_to('Deactivate', '...', disabled: deactivated?)
end
2) 在模式1和模式2之间,模式2似乎更容易,因为不需要用块包装整个代码。为什么不经常使用这个?使用这个有什么坏处吗?vs模式1

除了访问未提交用户和提交用户的块之外,没有其他实际区别。但是您需要访问未提交的用户吗?我认为不是,我更愿意使用非阻塞选项

3) 对于模式3,为什么人们根本不使用这个模式


它们是这样做的,在控制器中设置var比在视图中设置var更可取。

演示者模式有许多缺点,尽管这个问题可能以基于意见的方式结束,但视图上下文添加了哪些模块?如果我想在不传递视图上下文的情况下手动添加它们,那么像
ActionView::Helpers::UrlHelper
<% @users.each do |u| %>
  <% present(u) do |user| %>
    <tr>
      <td><%= user.full_name %></td>
      <td><%= user.email %></td>
      <td><%= user.birthdate %></td>
      <td><%= user.birth_year %></td>
      <td><%= user.nickel_per_year %></td>
      <td><%= link_to 'Show', user %></td>
      <td><%= link_to 'Edit', edit_user_path(user) %></td>
      <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    </tr>
  <% end %>
<% end %>
<% @users.each do |u| %>
  <% user = UserPresenter.new(user, self) %>
    <tr>
      <td><%= user.full_name %></td>
      <td><%= user.email %></td>
      <td><%= user.birthdate %></td>
      <td><%= user.birth_year %></td>
      <td><%= user.nickel_per_year %></td>
      <td><%= link_to 'Show', user %></td>
      <td><%= link_to 'Edit', edit_user_path(user) %></td>
      <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    </tr>
<% end %>
def show
  @user = UserPresenter.new(User.find(params[:id]), view_context)
end

def index
   @users = Users.all.map {|user|  UserPresenter.new(user, view_context) }
end
def deactivate_button
   view_context.link_to('Deactivate', '...', disabled: deactivated?)
end