6

questions_controller.rb

  def index
    @questions = Question.all(app_params)
  end

  private

  def app_params
    params.require(:questions).permit(:question, :answer)
  end
end

问题.rb

class Question < ActiveRecord::Base
end

我对 ruby​​-on-rails 完全陌生。我正在关注一个指南,它说我应该处理一些“漏洞”或“安全问题”并且它使用了attr_accessible,但是在 Rails 4 上,他们建议使用强大的参数,所以现在我正在尝试使用它们。我对如何定义:questions参数感到困惑,因为我目前收到一条错误消息,提示:questions找不到参数。

:questions几乎是我将自己定义为 Web 开发人员的东西。

例如,我将定义问题=“你好吗?”,“你叫什么名字?”。我基本上开始很简单。我希望我创建的问题显示在我的网页上。最终,我计划制作一个基本上是问题列表和答案选项的网站。用户单击“提交”后,我想将信息存储到我的数据库中。

我什至应该要求这个作为参数吗?我完全迷路了。。

4

2 回答 2

1

你有我们可以查看的参数的转储吗?它们会在您的应用程序遇到错误时显示,并且通常会向您显示 rails 将通过的 params 数组


Rails 4 中的强大参数

强参数允许您允许在控制器中使用某些参数,从而防止任何恶意分配客户端。他们在 Rails 4.0 中替换了 attr_accessible

强参数仅适用于用户提交的内容,因为它旨在保护参数哈希。为此,它主要与createandfind函数一起使用:

class PeopleController < ActionController::Base
  # Using "Person.create(params[:person])" would raise an
  # ActiveModel::ForbiddenAttributes exception because it'd
  # be using mass assignment without an explicit permit step.
  # This is the recommended form:
  def create
    Person.create(person_params)
  end

  # This will pass with flying colors as long as there's a person key in the
  # parameters, otherwise it'll raise an ActionController::MissingParameter
  # exception, which will get caught by ActionController::Base and turned
  # into a 400 Bad Request reply.
  def update
    redirect_to current_account.people.find(params[:id]).tap { |person|
      person.update!(person_params)
    }
  end

  private
    # Using a private method to encapsulate the permissible parameters is
    # just a good pattern since you'll be able to reuse the same permit
    # list between create and update. Also, you can specialize this method
    # with per-user checking of permissible attributes.
    def person_params
      params.require(:person).permit(:name, :age)
    end
end

参数要求

params.require 函数通过使用这个 params 哈希来工作:

params{:question => {:question => "1", :answer => "5"}}

这就是为什么人们问你的 params 散列是什么样的,因为 require 函数只有在:question散列存在的情况下才能工作。


可能的解决方案

  1. Question.all(app_params)

无论您要达到什么目的,都不要使用all. 该where函数更适合接收基于某些值的数据数组。我相信无论如何都会贬值

def index
    @questions = Question.where("value = ?", variable)
end
  1. 传递的是什么数据?

我将定义问题=“你好吗?”,“你叫什么名字?”

这没关系,但通常在 Rails 中,您会使用数据库中的 ID 调用数据。如果您在表格中定义这些问题,您将使用强大的参数系统;但你需要一个表格来提交数据


进一步补充

rails 方法是将所有数据保存在数据库中,并使用应用程序来操作这些数据,或者通过显示它,或者允许人们输入更多。

“params”变量基本上是为了帮助 Rails 控制器和模型接受和处理来自最终用户的数据,从而让您保持系统增长。参数不必编写自定义代码来适应各种不同的数据,而是为您提供了一个严格的结构来使用。以下是 MVC(和参数)如何为您工作的一个很好的解释:MVC 系统如何工作?

我认为您对应用程序的工作方式感到困惑

您的“问题”应该存储在questions表/模型中,并且可以通过使用find函数调用他们的 ID 来访问。这段代码将是这样的:

#app/controllers/questions_controller.rb
def show
    @question = Question.find(params[:id])
end

如果要添加新问题,最好将它们添加到问题表中,如下所示:

#app/controllers/questions_controller.rb
def new 
    @question = Question.new
end

def create
    @question = Question.new(question_params)
    @question.save
end


private
def question_params
    params.require(:question).permit(:question)
end


#app/views/questions/new.html.erb
<%= form_for @question do |f| %>
    <%= f.text_field :question %>
<% end %>

这将为您提供问题的中央存储,然后您可以在需要时访问它们,无论是使用helper“.all”还是“.all”调用:)

于 2013-10-12T12:42:08.923 回答
0

试一试question(单数):

params.require(:question).permit(:text, :answer)

假设question是您的模型,并且text(我编造的)是问题的措辞。

于 2013-10-12T04:51:25.653 回答