【问题标题】:rails 4 new action unknown attribute errorrails 4新动作未知属性错误
【发布时间】:2015-03-15 04:41:28
【问题描述】:

我收到以下错误

PostsController 中的 UnknownAttributeError#new

未知属性:company_id

帖子控制器

def new
    @company = Company.find(params[:company_id])
    @post = @company.posts.build
end

def create
    @company = Company.find(params[:company_id])
    @post = @company.posts.build(post_params)

    if @post.save
        redirect_to @post
    else
        render 'new'
    end
end

private

def post_params
 params.require(:post).permit(:title, :summary, :body)
end

路线

resources :companies do 
 resources :posts
end

型号

class Post < ActiveRecord::Base
 belongs_to :company
end

class Company < ActiveRecord::Base
 belongs_to :user, dependent: :destroy
 has_many :posts
end

表格

<%= form_for (@post) do |f| %>
  <div class="form-group">
    <%= f.label :Post_Title %>
    <%= f.text_field :title, class: "form-control", placeholder: "Post Title" %>
  </div>
  <div class="form-group">
    <%= f.label :Post_Summary %>
    <%= f.text_area :summary, class: "form-control", placeholder: "Post Summary" %>
  </div>
  <div class="form-group">
    <%= f.label :Post_Post %>
    <%= f.text_area :body, class: "form-control", placeholder: "The Post" %>
  </div>
  <div class="form-group">
    <%= f.submit :Submit, class: "btn btn-success" %>
  </div>
<% end %>

我希望每个帖子都属于一家公司,一个帖子在其表中具有company_id 属性。我不知道为什么这不起作用。

【问题讨论】:

  • 请从您的帖子控制器发布您的视图和 post_params 方法。
  • 添加视图和 post_params 方法
  • 你知道,你仍然需要传递一个 company_id 才能让你的控制器在 params 哈希中接收它。您的视图和参数方法都不包括 company_id。这是您在创建表后在迁移中添加的列吗?
  • company_id 在参数中传递(在 url 中)。 “新”视图甚至没有渲染,你有解决方案吗?
  • company_id 传递为hidden_field 来自form

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

post_params中添加company_id

posts_controller.rb

private

def post_params
 params.require(:post).permit(:title, :summary, :body, :company_id)
end

在您的表单中添加company_id

<%= form_for (@post) do |f| %>
  <div class="form-group">
    <%= f.label :Post_Title %>
    <%= f.text_field :title, class: "form-control", placeholder: "Post Title" %>
  </div>
  <div class="form-group">
    <%= f.label :Post_Summary %>
    <%= f.text_area :summary, class: "form-control", placeholder: "Post Summary" %>
  </div>
  <div class="form-group">
    <%= f.label :Post_Post %>
    <%= f.text_area :body, class: "form-control", placeholder: "The Post" %>
  </div>

  <%= hidden_field_tag 'company_id', @company.id %>

  <div class="form-group">
    <%= f.submit :Submit, class: "btn btn-success" %>
  </div>
<% end %>

【讨论】:

    【解决方案2】:

    嵌套资源时,最终会破坏路由中的许多默认路径。通常,这只是将posts_path 更新为company_posts_path(@company) 之类的简单修复。

    在这种情况下,您的form_for 会将您发送到旧的posts#new,而不是您新嵌套的。我将继续猜测您在发布的嵌套资源之外的路线中仍然有resources :posts

    要解决此问题,您需要将form_for(@post) 的路径更改为form_for([@company, @post])。这样,表单就会知道将您发送到嵌套在 @company 内的 @post 表单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多