【问题标题】:Simple_form does not accept the instance variable from action createSimple_form 不接受来自 action create 的实例变量
【发布时间】:2019-08-24 16:47:27
【问题描述】:

我正在创建一个非常简单的 StackOverflow 类型的网站 用 Ruby on Rails 编写。我在问题控制器中创建了四个操作,其中之一是 'Create'

我在视图页面 index.html.erb 中继续,并创建了一个 simple_form,我从用户那里获得 input(question)

我收到一个错误(NoMethodError in Questions#index..undefined method `[]' for nil:NilClass)

问题属于 current_user,我认为这可能是问题所在。我想也许我需要再初始化一个变量才能让我的表单正常工作。

谁能告诉我我在这里缺少什么?

提前谢谢你!

class QuestionsController < ApplicationController

  def index
   @questions = Question.all
  end

  def show
   @question = Question.find(params[:id])
  end

  def new
   @question = Question.find(params[:user_id])
   @question = Question.new
  end

  def create
    @question = Question.new(accepted_params)
  if @question.save
    redirect_to questions_show_path, notice: 'Question submitted'
  else
     @question = Question.find(params[:id])
     render :new
  end
  end
<%= simple_form_for @questions, @user do |f| %>
    <%= f.input :title %>
    <% f.input :content %>
    <%= f.submit :submit, class: 'btn btn-secondary'%>
<% end %>

【问题讨论】:

  • 我认为问题出在simple_form_for 的第二个参数上。您想要的是可以解析为 URL 的东西。 @user 如果不是 nil 就可以工作......因为 Rails 可以从 ActiveRecord 对象中创建一个 url。因此,在这种情况下,您可能需要将 @user 设置为 User 模型......或者使用例如url: my_named_route_path 作为第二个选项。还要确保使用非零实例变量来包装表单。所以我认为@questions 应该是@question 来自您的new 操作。
  • 好吧,我考虑了一下,然后我输入了@user = User.find(params[:current_user]),因为我使用 devise gem 来使用它登录的当前用户。因为 devise,所以更加混乱。我尝试了路径,但也没有用。

标签: ruby-on-rails


【解决方案1】:

您应该使用以下代码:

def create
  @question = Question.new(accepted_params)
  if @question.save
    redirect_to question_path(@question), notice: 'Question submitted'
  else
    render :new
  end
end

让我解释一下:

  • 在创建操作中没有params[:id](因为我们正在创建一个新项目)
  • 另外:我们确定保存失败,因此尝试从数据库中检索它仅对 edit 操作有意义
  • 第三:simple-form 将查看错误消息并将它们合并到表单中,因此用户可以修复错误。
  • 最后:我将您的redirect_to 修复为更像“轨道”,但这取决于您的路线定义。我假设您的路线中有resources :questions 之类的东西(但如果您不提供也永远不会起作用的参数,恕我直言)

例如如果您的模型中有validate_presence_of :name,这可能会在保存时导致验证错误,然后我们可以在重新渲染时在表单中以红色显示该字段。

[表格中的错字?]

最后,在您发表评论后,我注意到它说 simple_form_for @questions, @user 应该是单数 simple_form_for @question。如果您想将问题编辑为用户的嵌套路径,我认为正确的形式是simple_form_for [@user, @question]

【讨论】:

  • 好吧,我做了上面的修复,但它仍然给我同样的错误。它突出显示表单的第一行。谢谢你的时间。
  • 我注意到您的simple_form_for 不是标准的。你在学习任何类型的教程吗?
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2021-04-29
  • 2020-07-31
  • 2016-03-23
  • 1970-01-01
相关资源
最近更新 更多