Rails form_for使用Nil填充模型

时间:2015-08-01 23:42:13

标签: ruby-on-rails forms ruby-on-rails-3 model-view-controller form-for

我无法使用从form_for传递的参数填充模型,因为它将Nil分配给id,我的列(已解密),并在字段中创建/更新。

以下是我的观点(new.html.erb):

foo

和我的控制员:

  <%= form_for @decrypt_text, url: { action: "create" }  do |f| %>  
  <div class="field"> 
    <%= f.label :decrypt_text %><br> 
    <%= f.text_area :decrypted %><br> 
  </div> 
  <div class="actions"> 
    <%= f.submit "Submit" %> 
  </div> 
 <% end %>

以防万一,我的模特:

class DecryptController < ApplicationController
    def new
        @decrypt_text = Dmessage.new
  end

  def create
      @decrypt_text = Dmessage.new(params[:decrypted]) 
      p @decrypt_text

      if @decrypt_text.save 
        redirect_to '/decrypt/display' 
      else 
        redirect_to '/' 
      end     
  end

  def display
    @displayme = Dmessage.order("created_at").last
  end

end

我知道它正在分配零值,因为:

class CreateDmessages < ActiveRecord::Migration
  def change
    create_table :dmessages do |t|
      t.text :decrypted
      t.timestamps null: false
    end
  end
end

打印出来:

 p @decrypt_text

我真的不确定我错过了什么,但我对Rails相当新。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:1)

首先,从表单中删除url: { action: "create" }。由于Rails足够聪明,如果@decrypt_text不存在,它将触发必要的create操作,这是不必要的。

但是,我真正认为导致您麻烦的是您没有在应用程序中使用强参数@decrypt_text = Dmessage.new(params[:decrypted]))。您正试图直接初始化params哈希,这非常危险。从Rails版本4.x开始,不允许以这种方式直接初始化参数哈希,你必须使用强参数,以防止质量分配。

这些将是我个人在您的控制器文件中所做的更改......

class DecryptController < ApplicationController
  def new
    @decrypt_text = Dmessage.new
  end

  def create
    @decrypt_text = Dmessage.new(decrypt_params) 

    if @decrypt_text.save 
      redirect_to '/decrypt/display' 
    else 
      redirect_to '/' 
    end     
  end

  def display
    @displayme = Dmessage.order("created_at").last
  end

  private

    def decrypt_params
      params.require(:dmessage).permit(:decrypted)
    end
end

答案 1 :(得分:1)

如果您使用的是rails 4.x,则必须使用Rails版本4.x中的强参数,不允许直接初始化参数哈希值。

将以下私有方法添加到您的控制器,   def decrypt_params       params.require(:dmessage).permit(:解密)     结束

答案 2 :(得分:0)

当您使用 Rails 3 时,问题出在此行

@decrypt_text = Dmessage.new(params[:decrypted])

应该是

@decrypt_text = Dmessage.new(params[:dmessage])