Ruby on rails 轨道4.1从运行中的轨道4和rspec

Ruby on rails 轨道4.1从运行中的轨道4和rspec,ruby-on-rails,rspec,strong-parameters,Ruby On Rails,Rspec,Strong Parameters,我试图从《行动手册》中的rails4学习rails4.1,我已经学习了第13章,在这一章中定义了JSON和XML的API 它定义了如下控制器: class Api::V1::ProjectsController < Api::V1::BaseController def index respond_with(Project.for(current_user).all) end def create project = Project.new

我试图从《行动手册》中的
rails4
学习
rails4.1
,我已经学习了第13章,在这一章中定义了JSON和XML的
API

它定义了如下控制器:

class Api::V1::ProjectsController < Api::V1::BaseController  
  def index  
     respond_with(Project.for(current_user).all)  
  end  
  def create  
    project = Project.new project_params  
    if project.save  
      respond_with(project, :location => api_v1_project_path(project))  
    else  
      respond_with(errors: project.errors.messages)  
    end  
  end  
  private  
  def project_params  
    params.require(:project).permit(:name)  
  end  
end  
it "unsuccessful JSON" do  
  post "#{url}.json", :token => token, :project => {}  
  expect(last_response.status).to eql(422)  
  errors = {"errors" => { "name" => ["can't be blank"]}}.to_json  
  expect(last_response.body).to eql(errors)  
end  
当我运行测试时,我得到以下结果:

ActionController::ParameterMissing:缺少param或值为 空:项目


我知道,这是因为强大的参数。

我解决了这样的问题,但有人有更好的想法吗

def project_params  
  if params[:project].nil?  
    params[:project] = {:name => ''}  
  end  
  params.require(:project).permit(:name)  
end  

它解决了我的问题

params.require(:project).permit(:name, :description) if params[:project]

可以允许嵌套参数,如中所述。 在您的情况下,这可能是您想要的:

params.permit(:project => [:name, :description])