retrieve current parameter value in Rails controller - Error: Couldn't find Question without an ID

retrieve current parameter value in Rails controller - Error: Couldn't find Question without an ID

单击删除后,我希望我的页面重定向到当前用户的投票。像这样的东西。 questions_controller.rb:

  def destroy
    @poll_id = Question.find(param[:poll_id])
    @question.destroy

    respond_to do |format|
      format.html { redirect_to user_poll_url(current_user.id, @question.poll_id), notice: "Question was successfully destroyed." }
      format.json { head :no_content }
    end
  end

Questions_controller 的内容与生成的 rails 相同,但有上述更改。

question_controller 将 poll_id 作为参数。我如何检索它的当前值以用于重定向。

def question_params
  params.require(:question).permit(:poll_id, :title, :description)
end

routes.rb

  resources :users do
    resources :polls
  end
  resource :polls do
    resources :questions 
  end

我得到的错误是:

ActiveRecord::RecordNotFound in QuestionsController#destroy
Couldn't find Question without an ID

Extracted source (around line #52):           
  # DELETE /questions/1 or /questions/1.json
  def destroy
    @poll_id = Question.find(param[:poll_id])
    session[:return_to] ||= request.referer
    @question.destroy

第 52 行是 @poll_id = Question.find(param[:poll_id])

param[:poll_id] 不正确。您总是在名为 params 的方法中在控制器中获取这些属性,并且当我们从前端提交表单时 Rails 将它们映射到特定的键(模型的名称单数),例如,到得到你需要使用的poll_id

question_params[:poll_id]

相当于:

params[:question][:poll_id]

也不确定 poll_id 是否等于 questions table 中保存的 idfind 方法总是通过 id 找到,这意味着:

Question.find(param[:poll_id])

表示

SELECT * FROM questions WHERE id = param[:poll_id]

所以如果 poll_id 等价于 id 那么没关系,或者你可能想用 find_by 替换 find 或者你也可以使用 params[:id] 而不是 poll_id 如果存在(取决于您的路线)。

有关参数的更多信息:https://edgeguides.rubyonrails.org/action_controller_overview.html#parameters