"未定义的局部变量或方法`f' "在轨道上的红宝石上

时间:2017-08-23 15:17:33

标签: ruby-on-rails ruby

在我的应用中,我在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 %>

papers_controller.rb

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

transaction_controller.rb

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但仍然收到错误。我有点迷失在这里,有人可以帮助我吗?

2 个答案:

答案 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

如果您愿意,当然可以从多个控制器渲染完整错误等相同的表单/视图。