【问题标题】:"undefined local variable or method `f' " on ruby on railsruby on rails 上的“未定义的局部变量或方法‘f’”
【发布时间】:2017-08-23 23:37:55
【问题描述】:

在我的应用程序中,我在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 中但仍然得到错误。我有点迷路了,有人可以帮助我吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    未定义的局部变量或方法'f' <0x007fa790b51190>

    &gt;

    【讨论】:

    【解决方案2】:

    您显示的两个上下文中的f 完全不相关。视图和控制器共享属性(对于给定的请求)但不共享局部变量,而且您的 f 变量仅限于 form_for 块(从 do 到匹配的 end),它什么都没有与PapersController#create 方法有关。

    f.html 可以是一个 respond_to,但如果您支持 HTML,那并不是真正需要的。

    目前还不清楚f.html { redirect_to "", notice: "Error: Paper Not created!!"} 的意图是什么,因为它完全位于不同的控制器中。如果你只是想重定向到某个地方,那么直接使用redirect_to,去掉f.html这个东西。

    例如

    redirect_to transaction_path(current_user), notice: "Error: Paper Not created!!"
    

    如果您想显示错误并保持原来的表单值,那么通常,您可以在同一个控制器中拥有表单(通常是一个名为new 的操作)和create,并重用视图。

    class PapersController
      def new
        @paper = Paper.new
        render
      end
      def create
        @paper = Paper.new(paper_params)
        @paper.user = current_user
        if @paper.save
          redirect_to transaction_path(current_user), notice: "Post has been saved successfully."
        else
          render "new" # form_for will keep values from @paper, can also display @paper.errors
        end
      end
    end
    

    尽管如果您愿意,当然可以从多个控制器呈现相同的表单/视图,但会出现完全错误等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多