在我的应用中,我在views/transactions/show.html.erb
中渲染下面的部分,但是当我点击submit
时,我收到此错误:
undefined local variable or method 'f' for #<PapersController:0x007fa790b51190>
在控制器的这一行:
f.html { redirect_to "", notice: "Error: Paper Not created!!"}
:
<%= form_for ( @newPaper ) do |f| %>
<div class="field">
<%= f.label :date, class: 'form-text'%>
<%= f.date_select :date %>
</div>
<br />
<div class="field">
<%= f.label :paper_type %>
<%= f.select(:paper_type, options_for_select(Paper::PAPER_TYPES)) %>
</div>
<br>
<div class="field">
<%= f.label :paper_weight %> :<%= f.number_field :paper_weight, class: 'form-fields' %> -kg.
</div>
<br />
<div class="field">
<%= f.label :env_paper_weight %> :
<%= f.number_field :env_paper_weight, class: 'form-fields' %> -kg.
</div>
<br />
<br>
<div class="actions">
<%= f.submit "Add Paper" %>
</div>
<% end %>
class PapersController < ApplicationController
before_action :set_paper, only: [:edit, :update, :show, :destroy]
before_action :paper_owner, only: [ :edit, :update, :destroy]
def index
all_paper_type_values = Paper.all.pluck(:paper_type).uniq
@data_for_chart = all_paper_type_values.map do |paper_type|
{ name: paper_type, data: Paper.where(paper_type: paper_type).group_by_month(:created_at).sum(:paper_weight)}
end
@pappi = Paper.all
@newPaper = Paper.new
end
def new
@paper = Paper.new
end
def create
@paper = Paper.new(paper_params)
@paper.user_id = current_user.id
if (@newPaper.save)
redirect_to transaction_path(current_user), :notice => "Post has been saved successfully."
else
f.html { redirect_to "", notice: "Error: Paper Not created!!"}
end
end
def update
if @paper.update(paper_params)
flash[:success] = "Line was successfully updated"
redirect_to papers_path(@paper)
else
render 'edit'
end
end
def destroy
@paper.destroy
flash[:danger] = "Line was successfully destroyed"
redirect_to transaction_path(current_user)
end
private
def set_paper
@paper = Paper.find(params[:id])
end
def paper_params
params.require(:paper).permit(:user_id, :paper_type, :date, :paper_weight, :env_paper_weight)
end
def paper_owner
unless @paper.user_id == current_user.id
flash[:notice] = 'Access denied as you are not owner of this Job'
redirect_to papers_path
end
end
end
class TransactionsController < ApplicationController
def new
@paper = current_user.papers.build
@kwst = current_user.kwsts.build
@hwater = current_user.hwaters.build
@transport = current_user.transports.build
end
def show
@user = User.find(params[:id])
@username = params[:id]
@newPaper = Paper.new
@newKwst = Kwst.new
@newHwater = Hwater.new
@newTransport = Transport.new
@papers = current_user.papers.order(created_at: :desc).limit(5)
@kwsts = current_user.kwsts.order(created_at: :desc)
@hwaters = current_user.hwaters.order(created_at: :desc)
@transports = current_user.transports.order(created_at: :desc)
end
end
我改变了:
<%= form_for ( @newPaper ) do |f| %>
到
<%= form_for Paper.new do |f| %>
在paper_controller.rb
但仍然收到错误。我有点迷失在这里,有人可以帮助我吗?
答案 0 :(得分:1)
未定义的局部变量或方法&#39; f&#39;对于 &LT; PapersController:0x007fa790b51190&GT;
此行中的错误触发
f.html { redirect_to "", notice: "Error: Paper Not created!!"}
因为你没有在控制器方法中定义f
。
您似乎正在尝试使用create
编写respond_to
方法,然后创建方法应如下所示
def create
@paper = Paper.new(paper_params)
@paper.user_id = current_user.id
respond_to do |f|
if (@paper.save) #not @newPaper
f.html {redirect_to transaction_path(current_user), :notice => "Post has been saved successfully."}
else
f.html { redirect_to "", notice: "Error: Paper Not created!!"}
end
end
end
答案 1 :(得分:0)
您展示的两个上下文中的f
完全不相关。视图和控制器共享属性(对于给定的请求)但不共享局部变量,并且f
变量仅限于form_for
块(从do
到匹配的{{1} }),它与end
方法没有任何关系。
PapersController#create
可能是response_to,但如果您仅支持HTML,则不需要这样做。
你打算f.html
是什么意思并不是很清楚,因为那是完全不同的控制器。如果您只是想在某个地方重定向,那么只需直接使用f.html { redirect_to "", notice: "Error: Paper Not created!!"}
即可删除redirect_to
。
e.g。
f.html
如果您想显示错误并保留原始表单值,那么您可以在同一个控制器中使用表单(通常是一个名为redirect_to transaction_path(current_user), notice: "Error: Paper Not created!!"
的操作)和new
,并重用该视图
create
如果您愿意,当然可以从多个控制器渲染完整错误等相同的表单/视图。