questions_controller.rb
def index
@questions = Question.all(app_params)
end
private
def app_params
params.require(:questions).permit(:question, :answer)
end
end
question.rb
class Question < ActiveRecord::Base
end
我对ruby-on-rails完全不熟悉。我正在关注一个指南,它说我应该处理一些“漏洞”或“安全问题”并使用attr_accessible
,但在Rails 4上,他们提出了强大的参数,所以现在我正在尝试使用它们。我对如何定义:questions
参数很困惑,因为我目前收到的错误是没有找到:questions
参数。
:questions
几乎是我自己定义为Web开发人员的东西。
例如,我将定义问题=“你好吗?”,“你叫什么名字?”。我基本上很简单。我想要创建的问题显示在我的网页上。最终,我计划建立一个基本上是问题列表的网站,并提供答案选项。用户点击“提交”后,我想将信息存储到我的数据库中。
我是否应该将此作为一个参数?我完全迷失了......
答案 0 :(得分:1)
你有一个我们可以看到的参数转储吗?当你的应用遇到错误时会显示它们,并且通常会显示哪些轨道将通过的params数组
Rails 4中的强大参数
Strong Params允许您允许在控制器中使用某些参数,以防止任何恶意分配客户端。他们在Rails 4.0中取代了attr_accessible
Strong Params仅适用于用户提交的内容,因为它旨在保护params哈希。为此,它主要用于create
和find
函数:
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.require函数通过使用这个参数散列来实现:
params{:question => {:question => "1", :answer => "5"}}
这就是为什么人们会问你的params hash是什么样的,因为require函数只有在:question
哈希存在时才能工作。
可能的解决方案
Question.all(app_params)
无论您想要实现什么目标,都不要使用all
。 where
函数更适合基于特定值接收数据数组。我相信all is depreciated anyway。
def index
@questions = Question.where("value = ?", variable)
end
我将定义问题=“你好吗?”,“你叫什么名字?”
这没关系,但通常在rails中,您可以使用数据库中的ID来调用数据。如果你在一个表格中定义这些问题,你就会使用强大的params系统;但是你需要一个表格来提交数据
进一步增加
rails方式是将所有数据保存在数据库中,并使用应用程序通过显示数据或允许人们输入更多数据来操纵数据。
“params”变量基本上可以帮助轨道控制器和模特接受&amp;处理来自最终用户的数据,从而使您可以保持系统不断增长。这些参数不是必须编写自定义代码来容纳各种不同的数据,而是为您提供了一个严格的结构。以下是对MVC(和params)如何为您工作的一个很好的解释: How does an MVC system work?
我认为你对应用的运作方式感到困惑
您的“问题”应存储在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”调用:)
答案 1 :(得分:0)
用question
(单数)拍摄:
params.require(:question).permit(:text, :answer)
假设question
是你的模型而text
(我编造的)是问题的措辞。