从rails控制器返回值 - 混淆了Java程序员

时间:2014-01-30 11:19:59

标签: ruby-on-rails ruby-on-rails-3 return-value

noobie rails问题。我读到了"最后评估的声明"在ruby中返回而没有明确写出" return ..."。 以下示例(来自本教程Rails and Javascript

 class UsersController < ApplicationController
  def index
    @users = User.all
    @user = User.new
  end

现在在html.erb中,他们就像这样使用它

<ul id="users">
<% @users.each do |user| %>
  <%= render user %>
<% end %>
</ul>

所以我不必显式返回实例变量,我的视图中都可以使用它们(@users和@user)。这对于实例变量是唯一的,还是可以使用局部变量来自Java。

3 个答案:

答案 0 :(得分:1)

视图中始终提供实例变量。你不需要退货。

以下是关于变量如何从控制器传递到视图的一个很好的解释:

How are Rails instance variables passed to views?

答案 1 :(得分:0)

def index
  @users = User.all
  @user = User.new
  user_detail = get_user_info(@users.last)
end

这是控制器中的一个动作,实际变量的实例变量将在视图中可用。只需考虑一个名为get_user_info

的方法
def get_user_info(user)
  name = user.name
  email = user.email
end

user_detail将包含email的值,上面的方法将返回默认的最后一个值。

答案 2 :(得分:0)

控制器方法不会向您的视图返回值。相反,它将呈现的页面返回到请求来自的浏览器。 控制器自动调用对同名模板的render调用只是一种惯例。

您可以使用相同的行为编写这样的控制器方法:

class UsersController < ApplicationController
  def index
    @users = User.all
    @user = User.new

    return render 'index'
end

由于自动返回最后一个评估值,因此这是等效的:

class UsersController < ApplicationController
  def index
    @users = User.all
    @user = User.new

    render 'index'
  end

由于控制器会自动调用相同名称的渲染,您可以完全删除它(除非您的模板名称与控制器方法不同)

class UsersController < ApplicationController
  def index
    @users = User.all
    @user = User.new
  end

在控制器中包含太多实例变量被认为是不好的做法,所以你可能想要手动调用渲染并传递这样的局部变量:

class UsersController < ApplicationController
  def index
    users = User.all
    user = User.new

    render 'index', :locals => { :all_users => users, :new_user => user }
  end

访问前端的本地人:

<ul id="users">
  <% all_users.each do |user| %>
    <%= render user %>
  <% end %>
</ul>