Rails Controller Confusion

时间:2017-08-16 20:14:27

标签: ruby-on-rails model-view-controller controller

这是我的第一篇文章。

我是Rails的新手,我正在尝试学习如何使用它。要清楚,我熟悉Ruby。我很确定我得到了MVC结构,但是我无法理解我遇到的某些行为。

万一有人从同一个来源学习,我正在看Derek Banas解释它。他在16:20左右解释了我遇到麻烦的事情。 https://www.youtube.com/watch?v=GY7Ps8fqGdc

详细说明 - 所以我把这行放在我的routes.rb文件中:

 match':controller(/:action(/:id))', :via => :get

我用控制器在控制器中创建了一个实例变量:

  def sample
    @controller_message = "Hello From The Controller"
  end

在我创建的示例视图中,我调用了“controller_message”变量,如下所示:

<%= "#{@controller_message}" %>

它在一半的时间内适用于那个视图。根据我的理解,我应该在视图中放置代码行的任何地方看到“Hello from The Controller”,对吧?也许我只是不明白这是如何运作的,但我在同一目录中创建了其他视图文件,试图看看控制器如何将数据传递给视图。他们加载和一切,但我没有收到控制器的消息。有时,看似不一致,控制器消息甚至不会显示在它最初工作的第一个视图上,特别是如果我在网站上稍微浏览一下。为了让它再次显示该消息,我必须重新启动我的服务器。

所以,我只是误解了MVC是如何工作的,还是我的软件故障(不太可能,我知道),或者是什么?我很困惑。

我听说过这个社区有很多很棒的事情。提前感谢愿意帮助我的人。我很紧张。

3 个答案:

答案 0 :(得分:0)

#{}中的<%= "#{@controller_message}" %>是字符串插值。在视图中显示实例变量的通常惯例是<%= @controller_message %>

@controller_message方法中声明的变量sample使该变量可用于与该方法关联的视图。默认情况下,rails将查找与控制器方法同名的相应视图文件,因此在这种情况下,它将在sample.html.erb文件夹中查找名为app/views/your_controllers_name的视图

答案 1 :(得分:0)

好吧,澄清事情(因为你的问题有点模糊):rails在场景背后做了很多事情,比如将控制器的名称与视图名称相关联。这就是为什么在大多数情况下,你不会在控制器的方法中调用视图进行渲染(Rails会根据文件的名称对你进行渲染)。因此,有意义的是,控制器方法中声明的变量仅显示在与调用的控制器方法同名的视图中。如果要在视图中显示与控制器方法无关的变量,则应使用Render和Redirect等方法调用该视图,并将变量作为参数传递给这些方法。

I.g:

other.controller

def edit          
  render "/another_view_folder/example.html.erb", @variable_to_be_displayed
end

另一件事:

<%= @controller_message %>

这足以显示变量。你正在做的是Interpolation(用于将变量与字符串连接起来)。

我希望我能帮到你!

答案 2 :(得分:0)

如果在视图路径中找到视图文件,Rails将隐式呈现视图文件。

所以给出:

# config/routes.rb
get 'foos/bar'


# app/controllers/foo_controller.rb
class FoosController < ApplicationController
  def bar
    @controller_message = 'Hello'
  end
end

当我们请求bar.html.erb时,Rails会尝试在app/views/foos中找到文件/foos/bar。如果我们想渲染另一个视图,我们需要告诉导航到render it explicitly.

class FoosController < ApplicationController
  def bar
    @controller_message = 'Hello'
    render 'some_other_view' # renders app/views/foos/some_other_view.html.erb
    # or
    render 'some_other_folder/some_other_view' # renders app/views/some_other_folder/some_other_view.html.erb
  end
end
  

根据我的理解,我应该看到&#34; Hello From The Controller&#34;代码行放在视图中的任何地方,对吧?

没有。让我们说你添加另一个控制器和视图。

# config/routes.rb
get 'people', to: 'people#index'

# app/controllers/people_controller.rb
class PeopleController < ApplicationController
  def index
  end
end

# app/views/people/index.html.erb
<h1>The message is: <%= @controller_message %></h1>

它只会渲染The message is:。由于PeopleController未设置实例变量@controller_message。如果引用未分配的实例变量,Ruby不会引发错误。

理由是,Rails中的控制器将其所有实例变量打包并将它们传递给视图上下文,以便我们可以在视图中使用它们。

控制器完成渲染后,它会发送渲染的模板,程序退出*。实例变量,局部变量等不会转移到下一个请求。