nil的未定义方法`update':NilClass。 Friendly_id和Scaffolded控制器

时间:2016-09-14 04:58:14

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

我收到此错误,说明未定义的方法更新。 show和Edit按钮效果很好。这只是更新无效。我正在使用friendly_id,控制器是支架,具有更好的路由。

这是我的路线:

Rails.application.routes.draw do

  resources :static_pages, except: [:show, :edit]

  devise_for :users

  mount Bootsy::Engine => '/bootsy', as: 'bootsy'

  get 'profile' => "users#profile"

  root 'indexes#index'

  get ':slug', to: 'static_pages#show'

  get ':slug/edit', to: 'static_pages#edit'

  # The priority is based upon order of creation: first created -> highest priority.
  # See how all your routes lay out with "rake routes".

  # You can have the root of your site routed with "root"
  # root 'welcome#index'

  # Example of regular route:
  #   get 'products/:id' => 'catalog#view'

  # Example of named route that can be invoked with purchase_url(id: product.id)
  #   get 'products/:id/purchase' => 'catalog#purchase', as: :purchase

  # Example resource route (maps HTTP verbs to controller actions automatically):
  #   resources :products

  # Example resource route with options:
  #   resources :products do
  #     member do
  #       get 'short'
  #       post 'toggle'
  #     end
  #
  #     collection do
  #       get 'sold'
  #     end
  #   end

  # Example resource route with sub-resources:
  #   resources :products do
  #     resources :comments, :sales
  #     resource :seller
  #   end

  # Example resource route with more complex sub-resources:
  #   resources :products do
  #     resources :comments
  #     resources :sales do
  #       get 'recent', on: :collection
  #     end
  #   end

  # Example resource route with concerns:
  #   concern :toggleable do
  #     post 'toggle'
  #   end
  #   resources :posts, concerns: :toggleable
  #   resources :photos, concerns: :toggleable

  # Example resource route within a namespace:
  #   namespace :admin do
  #     # Directs /admin/products/* to Admin::ProductsController
  #     # (app/controllers/admin/products_controller.rb)
  #     resources :products
  #   end
end

以下是更新方法的静态页面控制器:

class StaticPagesController < ApplicationController
  before_action :set_static_page, only: [:show, :edit, :update]
  before_action :static_page_params, only: [:update, :create]
  before_action :destroy_static_page, only: :destroy
  before_filter :except => [:show] do 
    redirect_to :new_user_session unless current_user && current_user.role == 5
  end

  # GET /static_pages
  # GET /static_pages.json
  def index
    @static_pages = StaticPage.all
  end

  # GET /static_pages/1
  # GET /static_pages/1.json
  def show
  end

  # GET /static_pages/new
  def new
    @static_page = StaticPage.new
  end

  # GET /static_pages/1/edit
  def edit
  end

  # POST /static_pages
  # POST /static_pages.json
  def create
    @static_page = StaticPage.new(static_page_params)

    respond_to do |format|
      if @static_page.save
        format.html { redirect_to @static_page, notice: 'Static page was successfully created.' }
        format.json { render :show, status: :created, location: @static_page }
      else
        format.html { render :new }
        format.json { render json: @static_page.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /static_pages/1
  # PATCH/PUT /static_pages/1.json
  def update
    respond_to do |format|
      if @static_page.update(static_page_params)
        format.html { redirect_to @static_page, notice: 'Static page was successfully updated.' }
        format.json { render :show, status: :ok, location: @static_page }
      else
        format.html { render :edit }
        format.json { render json: @static_page.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /static_pages/1
  # DELETE /static_pages/1.json
  def destroy
    @static_page.destroy
    respond_to do |format|
      format.html { redirect_to static_pages_url, notice: 'Static page was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_static_page
      @static_page = StaticPage.find_by_slug(params[:slug])
    end

    def destroy_static_page
      @static_page = StaticPage.find_by_slug(params[:slug])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def static_page_params
      params.require(:static_page).permit(:title, :video_id, :content, :tags, :author, :date, :slug)
    end
end

以下是编辑页面搭建的视图:

%h1 Editing static_page

= render 'form'

= link_to 'Show', @static_page
\|
= link_to 'Back', static_pages_path

编辑:这与我的路线有关。我无法让show按钮在4m波纹管上工作。我尝试@ static_page.slug,但这需要我到/ page_name / page_name。当我执行@static_page时,它会将我带到/ static_page / page_name。我需要它做的是带我到/ page_name。

编辑2:这是表格部分:

= simple_form_for(@static_page) do |f|
  = f.error_notification

  .form-inputs
    = f.input :title
    = f.input :video_id
    .bootsy_text_area
      = f.bootsy_area :content, :class => 'form-control', rows: 12
    = f.input :tags
    = f.input :author
    = f.input :date

  .form-actions
    = f.button :submit

1 个答案:

答案 0 :(得分:1)

您正在致电@static_page.update(static_page_params),但在这种情况下,@static_page为零。

您已将@static_page定义为@static_page = StaticPage.find_by_slug(params[:slug]),但如果找不到包含该子弹的网页,则会返回nil

有两种方法可以解决这个问题:

  • 使用find_by_slug!代替,如果没有找到记录,则会引发异常,或者:
  • 自己检查nil是否存在,并决定如何处理它。