我正在研究RoR 4中的一个小应用程序,并且正在遇到打嗝。这是我正在使用的代码:
def update
@status = current_user.statuses.find(params[:id])
if params[:status] && params[:status].has_key?(:user_id)
params[:status].delete(:user_id)
end
respond_to do |format|
if @status.update(status_params)
format.html { redirect_to @status, notice: 'Status was successfully updated.' }
format.json { render :show, status: :ok, location: @status } #Original
else
format.html { render :edit }
format.json { render json: @status.errors, status: :unprocessable_entity }
end
end
end
private
# Never trust parameters from the scary internet, only allow the white list through.
def status_params
params.require(:status).permit(:user_id, :content)
end
end
这是我正在进行的测试:
test "should not update status if nothing has changed" do
sign_in users(:sean)
patch :update, id: @status
assert_redirected_to status_path(assigns(:status))
assert_equal assigns(:status).user_id, users(:sean).id
end
当我运行测试时,这是我得到的失败:
1) Error:
StatusesControllerTest#test_should_not_update_status_if_nothing_has_changed:
ActionController::ParameterMissing: param is missing or the value is empty: status
app/controllers/statuses_controller.rb:80:in `status_params'
app/controllers/statuses_controller.rb:51:in `block in update'
app/controllers/statuses_controller.rb:50:in `update'
test/controllers/statuses_controller_test.rb:83:in `block in <class:StatusesControllerTest>'
当我发出puts语句时,输出显示: {&#34;状态&#34; = GT; {&#34;内容&#34; = GT;&#34; MYTEXT&#34;}
所以我假设参数存在并填充。任何有关这方面的帮助将非常感激,因为我在我的智慧结束。这是我的github链接,代码托管在这里:
答案 0 :(得分:5)
问题在于您的测试用例patch :update, id: @status
。
试试这个:
patch :update, {id: @status.id, status: {user_id: @status.user_id, content: 'MyText'}}
您的控制器更新方法要求您传入的参数具有上述格式。 An:状态ID的id键和包含要更新的状态参数的散列的状态键。
你遇到的例外是你没有传递状态参数。
另一方面,最好放一个params.require(:id)
而不是params[:id]
,因为你的方法取决于它。