Ruby on rails 在Rails4.x中呈现编辑表单时,参数丢失或值为空错误
大师 我正在制作一个简单的编辑表单,并且在Rails4.x中遇到了这个错误。有趣的是,edit.html.erb基本上是new.html.erb的一个副本,而new.html.erb工作得很好 错误是: 缺少参数或值为空:teacherRuby on rails 在Rails4.x中呈现编辑表单时,参数丢失或值为空错误,ruby-on-rails,Ruby On Rails,大师 我正在制作一个简单的编辑表单,并且在Rails4.x中遇到了这个错误。有趣的是,edit.html.erb基本上是new.html.erb的一个副本,而new.html.erb工作得很好 错误是: 缺少参数或值为空:teacher def teacher_params params.require(:teacher).permit(:firstname, :lastname,
def teacher_params
params.require(:teacher).permit(:firstname,
:lastname,
:email,
:cellphone,
应用程序跟踪是:
app/controllers/teacher_controller.rb:39:in `teacher_params'
app/controllers/teacher_controller.rb:23:in `edit'
编辑表格为:
<h1>Add A teacher</h1>
<%= form_for @teacher, :url => { :action => 'edit'}, :id => @teacher.id, :html => { :multipart => true } do |f| %>
<table summary="teacher form fields">
<tr>
<th>First Name*</th>
<td><%= f.text_field :firstname %></td>
</tr>
<tr>
<th>Last Name*</th>
<td><%= f.text_field :lastname %></td>
</tr>
<tr>
<th>Email*</th>
<td><%= f.email_field :email %></td>
</tr>
<tr>
<th>Cellphone</th>
<td><%= f.telephone_field :cellphone %></td>
</tr>
<tr>
<th>Username*</th>
<td><%= f.text_field :username %></td>
</tr>
<tr>
<tr>
<th>Password*</th>
<td><%= f.password_field :password %></td>
</tr>
<tr>
<th>Confirm Password*</th>
<td><%= f.password_field :password_confirmation %></td>
</tr>
<tr>
<th>Address Street#</th>
<td><%= f.text_field :addr_streetno %></td>
<th>Apt #</th>
<td><%= f.number_field :addr_aptno %></td>
</tr>
<tr>
<th>City</th>
<td><%= f.text_field :addr_city %></td>
<th>State</th>
<td><%= f.text_field :addr_state %></td>
<th>Zip</th>
<td><%= f.number_field :addr_zip %></td>
</tr>
<tr>
<th>Photo</th>
<td><%= f.file_field :photo %></td>
</tr>
</table>
<%= f.submit 'Update teacher' %>
<% end %>
<% if @teacher.errors.any? %>
<ul class="Signup_Errors">
<% for message_error in @teacher.errors.full_messages %>
<li>* <%= message_error %></li>
<% end %>
</ul>
<% end %>
</div>
以下是迁移文件:
create_table :teachers do |t|
t.string :firstname, null: false
t.string :lastname, null: false
t.string :email, null: false
t.string :cellphone
t.string :username, null: false
t.string :password_digest, null: false
t.string :addr_streetno
t.integer :addr_aptno
t.string :addr_city
t.string :addr_state
t.integer :addr_zip
t.binary :photo, :limit => 0.5.megabyte
t.timestamps
end
您必须将编辑操作拆分为2个操作,因为编辑默认为一个
get
请求:
def edit
@teacher = Teacher.find(params[:id])
respond_to { |format| format.html }
end
def update
@teacher = Teacher.find(params[:id])
if @teacher.update_attributes(teacher_params)
...
end
还要从表单中删除
:url=>{:action=>'edit'}
,因为它正在路由到更新
操作。如果您使用
这会自动发生本质上,我必须将控制器中的编辑操作拆分为udpate和edit。我在lynda.com上看到了一个工作示例,并遵循了它。其他人也说了同样的话。现在它开始工作了
我不得不在routes.rb中添加:补丁关键字
match ':controller(/:action/(:id))', :via => [:get, :post, :patch]
编辑表单是新表单的副本,只是操作是更新而不是创建,并且必须传递id
<%= form_for @teacher, :url => { :action => 'update', :id => @teacher.id}, :html => { :multipart => true } do |f| %>
第一个代码块并没有结束:
手机,
zishe,这就是错误的例子。可以找到不同操作的一些信息。谢谢。我将用我必须更改的细节更新帖子
match ':controller(/:action/(:id))', :via => [:get, :post, :patch]
<%= form_for @teacher, :url => { :action => 'update', :id => @teacher.id}, :html => { :multipart => true } do |f| %>
def edit
@teacher = Teacher.find(params[:id])
end
def update
@teacher = Teacher.find(params[:id])
# Update the object
if @teacher.update_attributes(teacher_params)
# If update succeeds, redirect to the list action
flash[:notice] = "Teacher updated."
redirect_to :action => 'show', :id => @teacher.id
else
# If update fails, redisplay the form so user can fix problems
render :action => 'edit'
end
end