簡體   English   中英

Rails:如何從控制器傳遞實例變量以呈現部分

[英]Rails: How to pass instance variables from a controller to render partial

我在將實例變量 (@article) 從控制器 (articles_controller.rb) 傳遞到 Ruby 中的部分渲染 (_form.html.erb) 時遇到問題。

這是發回的錯誤:

`undefined method `errors' for nil:NilClass`

錯誤

文章_controller.rb:

class ArticlesController < ApplicationController
  def new 
  end
  
  def create
    @article = Article.new(article_params)   
    if @article.save
      redirect_to @article
    else
      render 'new'
    end
  end
  
  def update
    @article = Article.find(params[:id])
    
    if @article.update(article_params)
      redirect_to @article
    else
      render 'edit', :article => @article
    end
  end
  
  def show
    @article = Article.find(params[:id])  
  end
  
  def index 
    @articles = Article.all    
  end
  
  private
    def article_params
      params.require(:article).permit(:title, :text)
    end
end

新的.html.erb

<h1>New Article</h1>

<%= form_for :article, url: articles_path do |f|%>
    <%= render partial: "form", :locals => {:article => @article} %>
<% end %>

<% link_to 'Back', articles_path %>

_form.html.erb

<% if @article.errors.any? %>
<div id="error_explanation">
    <h2>
        <%= pluralize(@article.errors.count, "error") %> prohibited this 
article from being saved:           
        </h2>
        <ul>
            <% @article.errors.full_messeages.each do |msg| %>
                <li><%= msg %></li>
            <% end %>
        </ul>
    </div>
<% end %>   

<p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>  
</p>

<p>
    <%= f.label :text %><br />
    <%= f.text_area :text %>        
</p>

<p>
    <%= f.submit %>     
</p>

任何幫助將不勝感激

def new 
  @article = Article.new
end  




<%= render partial: "form", collection: @article %>

甚至

<%= form_for @article do |f|%>
    <%= render 'form' %>
<% end %>

取決於你的需要

我在處理Rails 6應用程序時遇到了這個挑戰。

我想在不同控制器( app/controllers/categories_controller.rb )中定義的部分( app/views/shared/_header.html.erb )中使用實例變量。

這是我如何做到的

我想使用的實例變量是@categories ,它定義為:

# app/controllers/categories_controller.rb

class CategoriesController < ApplicationController

  def index
    @categories = Category.all
  end
  .
  .
  .
end

首先,我在app/views/layouts/application.html.erb渲染了app/views/shared/_header.html.erb部分,並以這種方式將@categories實例變量傳遞給它:

<%= render partial: '/shared/header', locals: { categories: @categories } %>

然后我以這種方式在部分中使用了實例變量:

# app/views/shared/_header.html.erb

<% @categories.each do |category| %>
  <%= link_to category do %>
    <%= category.name %>
  <% end %>
<% end %>

但是,這將需要一個控制器操作,為每個將使用部分的控制器視圖設置一個@categories實例變量。

如果您想讓變量在控制器和視圖中全局可用,這可能會有所幫助: Rails:跨多個控制器操作設置公共或全局實例變量

僅此而已。

我希望這會有所幫助

你應該這樣做,刪除@ 您將它傳遞給局部變量article以便您可以使用article而不是@article訪問它:

<% if article.errors.any? %>
<div id="error_explanation">
    <h2>
        <%= pluralize(article.errors.count, "error") %> prohibited this 
article from being saved:           
        </h2>
        <ul>
            <% article.errors.full_messeages.each do |msg| %>
                <li><%= msg %></li>
            <% end %>
        </ul>
    </div>
<% end %>   

<p>
    <%= f.label :title %><br />
    <%= f.text_field :title %>  
</p>

<p>
    <%= f.label :text %><br />
    <%= f.text_area :text %>        
</p>

<p>
    <%= f.submit %>     
</p>

有關更多信息,請查看傳遞本地變量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM