我无法使用从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相当新。任何帮助表示赞赏!
答案 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])