Ruby on rails 多对多关系在视图上未正确显示/保存

Ruby on rails 多对多关系在视图上未正确显示/保存,ruby-on-rails,many-to-many,rails-activerecord,Ruby On Rails,Many To Many,Rails Activerecord,我在工作和类别之间有一种多对多的关系。我想在work#index页面上显示每个作品的类别名称。 不幸的是,它显示为空[]: 有效#索引标记 <% @works.each do |work| %> <tr> <td><%= work.name %></td> <td><%= work.subtitle %></td> <td><%= work.catego

我在工作和类别之间有一种多对多的关系。我想在
work#index
页面上显示每个作品的类别名称。

不幸的是,它显示为空[]:

有效#索引标记

<% @works.each do |work| %>
  <tr>
    <td><%= work.name %></td>
    <td><%= work.subtitle %></td>
    <td><%= work.categories %></td>

    <td><%= link_to 'Show', work %></td>
    <td><%= link_to 'Edit', edit_work_path(work) %></td>
    <td><%= link_to 'Destroy', work, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>
我漏了一步吗?这不是节约吗?这是我的第一个rails项目;因此,我第一次建模。我希望本文档的其余部分能够帮助解决这个问题




以下是我如何将我的类别添加到我的作品中:




我有三个模型:work、category、categoryworks(联接表)

这是
工作的完整控制器\u控制器

class WorksController < ApplicationController
  # GET /works
  # GET /works.json
  def index
    @works = Work.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @works }
    end
  end

  # GET /works/1
  # GET /works/1.json
  def show
    @work = Work.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @work }
    end
  end

  # GET /works/new
  # GET /works/new.json
  def new
    @work = Work.new

    @all_categories = Category.all
    @work_category = @work.categoryworks.build

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @work }
    end
  end

  # GET /works/1/edit
  def edit
    @work = Work.find(params[:id])

    @all_categories = Category.all
    @work_category = @work.categoryworks.build
  end

  # POST /works
  # POST /works.json
  def create
    @work = Work.new(params[:work])

    respond_to do |format|
      if @work.save
        format.html { redirect_to @work, notice: 'Work was successfully created.' }
        format.json { render json: @work, status: :created, location: @work }
      else
        format.html { render action: "new" }
        format.json { render json: @work.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /works/1
  # PUT /works/1.json
  def update
    @work = Work.find(params[:id])

    respond_to do |format|
      if @work.update_attributes(params[:work])
        format.html { redirect_to @work, notice: 'Work was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @work.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /works/1
  # DELETE /works/1.json
  def destroy
    @work = Work.find(params[:id])
    @work.destroy

    respond_to do |format|
      format.html { redirect_to works_url }
      format.json { head :no_content }
    end
  end
end
class WorksController
我通过2个视频在rails中创建了多对多关系:

难道
不这样做吗

编辑

你的
工作
模型应该说
有很多:类别
,而不是
有很多:类别

class Work < ActiveRecord::Base
  attr_accessible :name, :subtitle
  validates :name, :presence => true
  has_many :categoryworks
  has_many :categories, :through => :categoryworks
end
课堂作业true
有很多:分类作品
拥有多个:类别,:至=>:categoryworks
结束

您需要在
Works
模型中包含
接受:categoryworks
的嵌套属性。 看

另外,
work.categories
正在显示
Category
,因为它返回一个数组。它应该是
work.categories.join(',')
一旦您解决了表单的问题,就尝试一下。

解决方案 我没有更新works_控制器内部的def create

params[:works][:id].each do |work|
  if !work.empty?
    @category.categoryworks.build(:work_id => work)
  end
end

啊,是的,我忘了说它只是说“分类然后”用图片更新问题更新了帖子。当我把它改成那个的时候,它只是说分类。。。我不认为这是正确的储蓄。
class WorksController < ApplicationController
  # GET /works
  # GET /works.json
  def index
    @works = Work.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @works }
    end
  end

  # GET /works/1
  # GET /works/1.json
  def show
    @work = Work.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @work }
    end
  end

  # GET /works/new
  # GET /works/new.json
  def new
    @work = Work.new

    @all_categories = Category.all
    @work_category = @work.categoryworks.build

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @work }
    end
  end

  # GET /works/1/edit
  def edit
    @work = Work.find(params[:id])

    @all_categories = Category.all
    @work_category = @work.categoryworks.build
  end

  # POST /works
  # POST /works.json
  def create
    @work = Work.new(params[:work])

    respond_to do |format|
      if @work.save
        format.html { redirect_to @work, notice: 'Work was successfully created.' }
        format.json { render json: @work, status: :created, location: @work }
      else
        format.html { render action: "new" }
        format.json { render json: @work.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /works/1
  # PUT /works/1.json
  def update
    @work = Work.find(params[:id])

    respond_to do |format|
      if @work.update_attributes(params[:work])
        format.html { redirect_to @work, notice: 'Work was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @work.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /works/1
  # DELETE /works/1.json
  def destroy
    @work = Work.find(params[:id])
    @work.destroy

    respond_to do |format|
      format.html { redirect_to works_url }
      format.json { head :no_content }
    end
  end
end
class Work < ActiveRecord::Base
  attr_accessible :name, :subtitle
  validates :name, :presence => true
  has_many :categoryworks
  has_many :categories, :through => :categoryworks
end
params[:works][:id].each do |work|
  if !work.empty?
    @category.categoryworks.build(:work_id => work)
  end
end