Rails 4:使用"强参数"强制特定值

eme*_*his 10 ruby ruby-on-rails strong-parameters ruby-on-rails-4

我正在努力创建一个用于创建"项目"的表单.最终我想只允许当前的user_id,但我还没有构建用户模型或身份验证,所以作为占位符,我只是硬编码1.

应用程序/视图/项目/ new.html.erb:

<%= form_for(:project, :url => {:action=>'create'}) do |f| %>
<%= f.text_field(:name) %>
<%= f.text_field(:instructions) %>
<%= f.hidden_field( :user_id, {:value=>1}) %>
<%= f.submit('Create Project') %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/ projects_controller.rb

  def create
    #save object
    if Project.create( project_params )
        redirect_to(:action=>'show')
    else
        render('new')
    end
  end

  private
    def project_params
      params.require(:project).permit({:user_id => [1]}, :instructions, :max_duration, :active, :max_videos, :hashed_id)
    end
Run Code Online (Sandbox Code Playgroud)

这是我尝试提交表单时遇到的错误:

Mysql2::Error: Field 'user_id' doesn't have a default value: INSERT INTO `projects` (`created_at`, `instructions`, `updated_at`) VALUES ('2013-08-16 17:38:56', 'sdfgsdf', '2013-08-16 17:38:56')
Run Code Online (Sandbox Code Playgroud)

看来project_params()方法正在剥离user_id.我究竟做错了什么?

Orl*_*ndo 1

可能是因为 params[:user_id] 是一个字符串,做这样的事情应该可行。

params.require(:project).permit({:user_id => ["1"]}, :instructions, :max_duration, :active, :max_videos, :hashed_id)
Run Code Online (Sandbox Code Playgroud)

  • 看起来它在最新的 Rails 中不起作用(至少从版本 4.1 开始)--&gt; https://github.com/rails/strong_parameters/issues/167 (9认同)