[英]Are there any cases in which Rails overwrites controller instance variables on render :partial?
[英]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.