【问题标题】:Rails: How to pass instance variables from a controller to render partialRails:如何从控制器传递实例变量以呈现部分
【发布时间】:2017-02-22 04:49:30
【问题描述】:

我在将实例变量 (@article) 从控制器 (articles_controller.rb) 传递到 Ruby 中的部分渲染 (_form.html.erb) 时遇到问题。

这是被发回的错误:

`undefined method `errors' for nil:NilClass`

articles_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

new.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>

任何帮助将不胜感激

【问题讨论】:

  • 你有没有在你的新方法中初始化@article?
  • 你试过我下面的答案了吗?
  • araratan,我试过了,但似乎没有奏效。 Shabini Rajadas,没错,我忘了在 new 中初始化 @article,我只在 create 中初始化了它
  • @aratatan,谢谢,我现在明白了。您将控制器的实例变量作为局部变量传递。现在一切正常

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:
def new 
  @article = Article.new
end  




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

甚至

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

取决于您的需求

【讨论】:

    【解决方案2】:

    我在开发 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: Set a common or global instance variable across several controller actions

    就是这样。

    我希望这会有所帮助

    【讨论】:

      【解决方案3】:

      您应该这样做,删除@。您将其传递给局部变量 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>
      

      更多信息请关注passing-local-variables

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-06
        • 2011-03-08
        • 2012-06-29
        • 2012-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多