Ruby On Rails : Why do we need to html_safe string? : Why html tags not rendered?

What is html_safe? Why use that? Read this

Lets say, you have a feature in your application such that you have a text-area (Integrated with text-editor plugin) in your form and use can write markups. These markups are supposed to be rendered in the view as HTML Tags (Just like they appeared in TextEditor like CKEditor). Suppose you write Continue reading

Ruby On Rails : difference between render and `render partial: :template`| Passing locals in partials

render & render :partial

  • render is a shorthand for render :partial.
  • render will not accept additional local variables for the partial, you need to use render :partial as following for that:
    render partial: 'some/path/to/my/partial', locals: { custom_var: 'Hello' }

In Rails 4.2

#  code is in slim template
# Either this works 
= render 'tabbed_pact_view', pacts: (current_user.pacts || [])


# or

= render partial: 'tabbed_pact_view', locals: {pacts: (current_user.pacts || [])}

This wont work

= render partial: 'tabbed_pact_view', pacts: (current_user.pacts || [])

Rails: Save Markups in variables for later use

content_for(name, content = nil, options = {}, &block) public

Calling content_for stores a block of markup in an identifier for later use. In order to access this stored content in other templates, helper modules or the layout, you would pass the identifier as an argument tocontent_for.

Note: yield can still be used to retrieve the stored content, but calling yield doesn’t work in helper modules, while content_for does.

<% content_for :not_authorized do %>
  alert('You are not authorized to do that!')
<% end %>

You can then use content_for :not_authorized anywhere in your templates.

<%= content_for :not_authorized if current_user.nil? %>

This is equivalent to:

<%= yield :not_authorized if current_user.nil? %>

content_for, however, can also be used in helper modules.

module StorageHelper
  def stored_content
    content_for(:storage) || "Your storage is empty"
  end
end

This helper works just like normal helpers.

<%= stored_content %>

You can also use the yield syntax alongside an existing call to yield in a layout. For example:

<%# This is the layout %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>My Website</title>
  <%= yield :script %>
</head>
<body>
  <%= yield %>
</body>
</html>

And now, we’ll create a view that has a content_for call that creates the script identifier.

<%# This is our view %>
Please login!

<% content_for :script do %>
  <script>alert('You are not authorized to view this page!')</script>
<% end %>

Then, in another view, you could to do something like this:

<%= link_to 'Logout', action: 'logout', remote: true %>

<% content_for :script do %>
  <%= javascript_include_tag :defaults %>
<% end %>

That will place script tags for your default set of JavaScript files on the page; this technique is useful if you’ll only be using these scripts in a few views.

Note that content_for concatenates (default) the blocks it is given for a particular identifier in order. For example:

 <% content_for :navigation do %>
   <li><%= link_to 'Home', action: 'index' %></li>
 <% end %>

And in other place:

 <% content_for :navigation do %>
   <li><%= link_to 'Login', action: 'login' %></li>
 <% end %>

Then, in another template or layout, this code would render both links in order:

<ul><%= content_for :navigation %></ul>

If the flush parameter is true content_for replaces the blocks it is given. For example:

<% content_for :navigation do %>
  <li><%= link_to 'Home', action: 'index' %></li>
<% end %>

<%#  Add some other content, or use a different template: %>

<% content_for :navigation, flush: true do %>
  <li><%= link_to 'Login', action: 'login' %></li>
<% end %>

Then, in another template or layout, this code would render only the last link:

<ul><%= content_for :navigation %></ul>

Lastly, simple content can be passed as a parameter:

<% content_for :script, javascript_include_tag(:defaults) %>

WARNING: content_for is ignored in caches. So you shouldn’t use it for elements that will be fragment cached.