新手问题 为何调试信息总是显示 permitted: false 啊?

ChileNeverDie · 2020年01月07日 · 最后由 Catherine 回复于 2020年01月07日 · 509 次阅读

目前在跟着 ROR Tutorial 做(在做 6.0 的项目,但是教材目前只有 Rails 5 的),7.1.1 那里,不管我是什么操作,调试信息总是显示 permitted: false,总觉得哪里不对,有没有哪位前辈能解个惑?谢谢!

共收到 12 条回复

不是谁都看过你看的教程啊,就算看过也忘得差不多了。整理你的代码和错误发上来。

我想,你應該就是把 params 直接印在 view 上面,所以得到 permitted: false 是很正常的 :) 關鍵字:「Strong Parameters」

Rei 回复

说实话代码有点多,也不知道错在了哪一步。。。

eddie 回复
<body>
  <%= render 'layouts/header' %> 
  <div class="container">
    <% flash.each do |message_type, message| %>
      <%= content_tag(:div, message, class: "alert alert-#{message_type}") %> 
    <% end %> 
    <%= yield %> 
    <%= render 'layouts/footer' %> 
    <%= debug(params) if Rails.env.development? %> 
  </div>
</body>

是不是 debug 那里的参数问题啊?

eddie 回复

求问,这个咋设置。。。,应该是跟这个有关 user_controller 里面的 private 方法

private
  # Use callbacks to share common setup or constraints between actions.
  def set_user
    @user = User.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def user_params
    params.require(:user).permit(:name, :email, :title, :password, :password_confirmation)
  end
ChileNeverDie 回复

就是 debug 那句。

a = {"abc" => 1}
# 假设a是你那的参数

# Case 1
puts a.merge({"efg" => 2})

# Case 2
puts a

你在 merge 一个 hash 时,就像你 user_params 方法里做的一样,不会改变本身 a 或者 params 的值。 所以你打到页面上的 params 始终是 false

你可以尝试用 binding.pry 或者 debugger 在 controller 方法里打断点,你看你把一个 params 给 permit 后,再直接调用 params,看它 permit 的情况就知道为什么了。

Catherine 回复

是不是意味着,这个 permitted false 不会影响网页的输出?

ChileNeverDie 回复

debug 是一个调试方法,只影响日志打印不影响页面;permitted: false 是 params 对象的一个属性。

ChileNeverDie 回复

不存在 "影响网页的输出" 这个概念。这些值都是你在 controller 的 action 中去 permit、去赋值、去改变的。页面上你只是可以展示这些值(或不展示),展示与否都是不会影响它本身的值的。就像你在终端定义一个 a 变量,你 puts a 变量,对 a 变量有任何影响和改变吗?具体是否 permit、是否赋值、是否改变。都是你在这个 action 中决定的。你可以把页面渲染这个动作当作是这个 action 中代码执行完毕后的最后一个延伸。

Catherine 回复

嗯嗯,我理解了。 那 permitted false 这样的情况,是不是代表少了东西或者多了东西?比如我 require 了 password,但是在有些页面我并没有涉及到这个,所以出来了个 false,还是哪里不对啊。。。

ChileNeverDie 回复

前面已经举过例子了

你在 controller 中去 permit 了 params,

params.require(:user).permit(:name, :email, :title, :password, :password_confirmation)

这行代码的结果是一个 permit 后的 params。

按我前面回复你的内容,你该想出 2 个可能的原因。

思路一: 在 permit 后,params 本身并没有改变,所以页面上还是 permit 为 false

这是一个可能的思路。是否正确,你需要去验证它!验证它,对于刚开始学习非常重要。

思路二: 只要 permit 参数后,params 就会变为 permit 为 true。

这也是一个可能的思路,你需要去验证它。

这两个思路你都去验证后,你就会知道你的问题:为何调试信息总是显示 permitted: false 啊?的原因了。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册