Rails 4,强参数,嵌套资源,构建和未定义方法允许

Eri*_*oke 2 nested-resources strong-parameters ruby-on-rails-4

我无法通过构建获得rails 4,强大的参数来处理嵌套资源.任何建议都会非常受欢迎.

RSPEC告诉我

创建动作创建动作失败/错误:click_button"创建动作"NoMethodError:未定义的方法permit' for "create":String # ./app/controllers/actions_controller.rb:24:inaction_params'#./ app/console/actions_controller.rb:10:in create' # ./spec/features/creating_actions_spec.rb:16:inblock(2 levels)in'

我的浏览器告诉我:

ActionsController#中的NoMethodError为"create"创建未定义的方法`permit':String

提取的来源(第24行):

def action_params params.require(:action).permit(:title,:description)结束

动作控制器包含:

def create
    @action = @project.actions.build(action_params)
    if @action.save
        flash[:notice] = "Action has been created."
        redirect_to [@project, @action]
    else
        flash[:alert] = "Action has not been created."
        render "new"
    end
end
private

def action_params
  params.require(:action).permit(:title, :description)
end
Run Code Online (Sandbox Code Playgroud)

我正在使用嵌套资源:

resources :projects do
  resources :actions
end
Run Code Online (Sandbox Code Playgroud)

表格如下:

<%= form_for [@project, @action] do |f| %>
<% if @action.errors.any? %>
<div id="error_explanation" >
  <h2><%= pluralize(@action.errors.count, "error") %>
  prohibited this action from being saved:</h2>

  <ul>
  <% @action.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
</ul>
 </div>
  <% end %>

 <p>
   <%= f.label :title %><br>
   <%= f.text_field :title %>
  </p>

  <p>
   <%= f.label :description %><br>
   <%= f.text_area :description %>
 </p>
 <%= f.submit %>
 <% end %>
Run Code Online (Sandbox Code Playgroud)

Gui*_*nco 7

发生这种情况是因为Rails默认发送一个:action包含所请求操作的参数.当你这样做时,params.require(:action)你实际上将所请求的操作的名称作为字符串返回,在这种情况下,创建.您可以明确告诉form_for使用另一个键作为哈希,解决您的强参数问题:

<%= form_for [@project, @action], as: :foo do |f| %>

在你的控制器中:

params.require(:foo).permit...