参数丢失或值为空?

时间:2015-07-05 22:12:23

标签: ruby-on-rails parameters

我正在尝试访问"编辑"链接以编辑对象,但我收到此错误:

Param is missing or the value is empty: preview

基本上,我有两个通过关联链接的模型:

Game model Review model

我在游戏的展示页面中渲染评论。当我尝试编辑评论时,它说我丢失了参数,或者评价控制器中的值为空。 路线也是嵌套的。我该如何解决这个问题?

提前致谢:)

的routes.rb

Rails.application.routes.draw do

  devise_for :users

  root "games#index"

  resources :games do
    resources :news
    resources :reviews, except: [:show, :index]
    resources :previews, except: [:show, :index]
  end

  resources :platforms
  resources :genres

end

show.html.erb(链接到游戏控制器)

<% if @news.last.created_at > preview.updated_at %>
    <p><%= link_to "edit", edit_game_preview_path(@game.id, preview.id) %></p>
<% end %>
    <p><%= link_to "delete", game_preview_path(@game.id, preview.id), method: :delete %></p>
<% end %>

评论部分(表格)

<%= form_for [@game, @previews.new] do |r| %>

    <h3 class="post_review">Preview this game</h3>

    <p><%= flash[:notice_submit] %></p>

    <p><%= r.text_field :title, placeholder: "Enter your tagline" %></p>

    <p><%= r.text_area :content, placeholder: "Enter your review here" %></p>

    <p><%= r.text_area :vote %></p>

    <p><%= r.hidden_field :game_id, value: @game.id %></p>

    <%= r.submit %>

<% end %>

评论控制器

class PreviewsController < ApplicationController

  before_action :authenticate_user!
  before_action :set_preview, only: [:show, :edit, :update, :destroy]
  before_action :set_game

  def new
    @preview = Preview.new
  end

  def create
    @preview = Preview.new(preview_params)
    @preview.user_id = current_user.id
    @preview.game_id = @game.id
    @preview.username = current_user.username

    if @preview.save
      redirect_to :back
      flash[:notice_submit] = "Thanks for you comment!"
    else
      redirect_to :back
      flash[:notice_submit] = "Either you've already voted, or you're not filling in all forms."
    end
  end

  def edit
    @preview.update(preview_params)
    redirect_to @game
  end

  def destroy
    @preview.destroy
    redirect_to @game
  end

  private

  def set_preview
    @preview = Preview.find(params[:id])
  end

  def set_game
    @game = Game.find(params[:game_id])
  end

  def set_user
    @user = User.find(params[:user_id])
  end

  def preview_params
    params.require(:preview).permit(:title, :content, :vote)
  end

end

1 个答案:

答案 0 :(得分:0)

您收到此错误的原因是preview_params您需要preview个对象。

我认为edit操作的控制器逻辑无效。对于edit操作,您只需要set_preview然后呈现编辑模板。 edit操作中的当前逻辑应采用update操作。

def edit

end

def update
    @preview.update(preview_params)
    redirect_to @game
end

表单的第一行也应该是:

<%= form_for [@game, @preview] do |r| %>