【问题标题】:Unable to get my edit button to work with form_with helper无法让我的编辑按钮与 form_with 助手一起使用
【发布时间】:2020-12-08 00:32:40
【问题描述】:

我正在尝试在 Rails 中使用 form_with 创建一个 Edit 操作...。我的其他 CRUD 操作工作正常,所以与我的 form_with 相关...

<%= form_with(model: [@game, @review], local:true) do |form| %>

这是我试图创建的标签,但是当我这样做时,我得到了这个错误

undefined method `review_path' for #<#<Class:0x00007fedfa8befd0>:0x00007fedfa8bd298>
Did you mean?  view_paths

引导我回到标签,这是我的控制器

class ReviewsController < ApplicationController
  before_action :set_review, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, except:[:index, :show]
  before_action :correct_user, only: [:edit, :update, :destroy]
  def index
    @reviews = Review.all
  end

  def show
    @review = Review.find(params[:id])
  end

  def new
   @game = Game.find(params[:game_id])
   @review = current_user.reviews.new
  end


  def edit
    review = @game.reviews.find(params[:id])
  end


  def create
    @review = current_user.reviews.new(review_params)
    @game = Game.find(params[:game_id])
    @review.game_id = @game.id

    respond_to do |format|
      if @review.save
        format.html { redirect_to game_reviews_path(@review), notice: 'Review was successfully created.' }
        format.json { render :show, status: :created, location: @review }
      else
        format.html { render :new }
        format.json { render json: @review.errors, status: :unprocessable_entity }
      end
    end
  end
  



  def update
    @review = current_user.reviews.update(review_params)
    @game = Game.find(params[:game_id])
    @review.game_id = @game.id

    respond_to do |format|
      if @review.update(review_params)
        format.html { redirect_to @review, notice: 'Review was successfully updated.' }
        format.json { render :show, status: :ok, location: @review }
      else
        format.html { render :edit }
        format.json { render json: @review.errors, status: :unprocessable_entity }
      end
    end
  end


  def destroy
    @review.destroy
    respond_to do |format|
      format.html { redirect_to game_reviews_path(@review), notice: 'Review was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  def correct_user
    @review = current_user.reviews.find_by(id: params[:id])
    redirect_to reviews_path, notice:" Not Authorized to Edit This Review" if @review.nil?
    end

  private
    def set_review
      @review = Review.find(params[:id])
    end


    def review_params
      params.require(:review).permit(:reviewed_game, :rating, :game_id, :user_id)
    end
  end

我的路线...

  devise_for :users
  resources :game_studios
  resources :games do
    resources :reviews
  end
  root to: "games#index"
end

对 Rails 还是很陌生,任何帮助都会很棒!

谢谢

【问题讨论】:

  • 我在def edit 中没有看到任何@game 或@review 定义
  • 抱歉,这是控制器中编辑的样子def edit @game = Game.find(params[:game_id]) @review = @game.reviews.find(params[:id]) end
  • 你能在这里分享routes.rb文件吗?
  • @ŌkamiXOukarin Rails.application.routes.draw do devise_for :users resources :game_studios resources :games do resources :reviews end root to: "games#index" /routing.html end
  • @Gabe571 请在您的问题中添加 routes.rb ,而不是在评论中添加它们

标签: ruby ruby-on-rails-3 controller


【解决方案1】:
def edit
end

private 
def set_review
  @game = Game.find params[:game_id] ####This is the key of fix
  @review = Review.find(params[:id])
end

您没有在 before_action 中初始化 @game 实例 所以当你打电话给&lt;%= form_with(model: [@game, @review], local:true) do |form| %&gt; @game 为 nil ,因此无法为该特定表单生成有效路由。

所以要么在编辑操作中或在 before_action 中设置这个@game 实例变量

【讨论】:

  • 谢谢你!解决了我的问题,现在是时候让我的渲染工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 2015-05-20
  • 2016-03-24
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多