声明强参数的值

时间:2015-01-31 17:23:52

标签: ruby ruby-on-rails-4 strong-parameters

当我必须为我的许可证中的一个参数声明值以及从表单后的值中声明值时,我遇到了问题。 看看我的代码:

class QuoteController < ApplicationController
  autocomplete :author, :name, :full => true
  autocomplete :Category, :title, :full => true

  def new
    @quotes = Quote.new
  end

  def create
    @quotes = Quote.new(quotesParams)
      if @quotes.save
        redirect_to root_url
      else
        redirect_to root_url
      end
  end

    private
    def quotesParams
      params.require(:quote).permit(:text,:author_id, :category_id, 
                                   {:send_type => ["web"]}, 
                                   {:user_id => [current_user.id])
    end
end

但是当我尝试保存在数据库send_type中时,user_id为空

2 个答案:

答案 0 :(得分:1)

强参数更多地是关于参数的结构而不是实际参数值。所以像:

{ :send_type => ["web"] }
{ :user_id => [current_user.id] }

不指定默认值,它们在params中指定嵌套值的结构。

我认为你应该在两个地方处理你的默认值:

  1. send_type应默认为模型内的'web'
  2. 模型需要
  3. user_id,但控制器应设置默认值(因为那是谁知道current_user
  4. 你的控制器里有这样的东西:

    def create
      @quotes = Quote.new(quotesParams) { |q| q.user_id = current_user.id }
      #...
    end
    
    def quotesParams
      params.require(:quote).permit(:text, :author_id, :category_id, :send_type)
    end
    

    如果控制器没有提供值,您的模型可以默认send_type'web'

答案 1 :(得分:0)

请为您的控制器尝试以下代码:

class QuoteController < ApplicationController
  autocomplete :author, :name, :full => true
  autocomplete :Category, :title, :full => true

  def new
    @quotes = Quote.new
  end

  def create
    @quotes = Quote.new(quotesParams)
    @quotes.send_type = "web"
    @quotes.user_id = current_user.id

    if @quotes.save
      redirect_to root_url
    else
      redirect_to root_url
    end
  end

  private
  def quotesParams
    params.require(:quote).permit(:text, :author_id, :category_id)
  end
end