Passing local variables to a view from controller

会有一股神秘感。 提交于 2019-12-03 12:39:00
Pradnya Kulkarni - Telang

I think it should be like

render 'books/show', :locals => {:resource => 'Some text'}

It works for me

Passing Data from the Controller to the View

Here's a NovelController class, to be put into app/ controllers/novel_controller.rb.

class NovelController < ApplicationController
      def index
        @title = 'Shattered View: A Novel on Rails'
      end
end

Since this is the Novel controller and the index action, the corresponding view is in app/views/novel/index.html.erb

<h1><%= @title %></h1>

Output:

Shattered View: A Novel on Rails

The view is interpreted after NovelController#index is run. Here's what the view can and can't access:

  • It can access the instance variables @title, because they've been defined on the NovelController object by the time NovelController#index finishes running.
  • It can call instance methods of the instance variables @title.

First I am wondering why would you need the template:. Are you on Rails 2.x? If not, then the :template option is no longer required. You should be able to get along fine with just

render "books/show"

Second do you need to specify the template? What is the controller you want to render from? If that's BooksController, then you don't need the template path either, which makes the line being just

render

That's without the variables yet. Now, I just checked, and a simple:

render locals: { resource: "Some text" }

as well as:

render 'books/show', locals: { resource: "Some text" }

works for me just fine. Maybe earlier Rails versions treated 'resource' as some kind of a keyword? Don't know, but the above Worksforme™ in both forms.

You can't pass local variables from a controller to a view. What you could do is define it as an instance variable and then it would automatically be available in the view.

@resource = @book

If you want to pass entirely different objects, then just define those instance variables differently.

You can get it as follows. All gives the same result. Here is the reference link.

render action: :show , locals: { resource: "Some text"}
render :show , locals: { resource: "Some text"}
render locals: { resource: "Some text"}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!