簡體   English   中英

Ruby on Rails麻煩使用has_many:through關系創建記錄

[英]Ruby on Rails trouble creating record with has_many :through relationship

我正在使用Rails 3.2.14,第一次使用has_many:through時遇到了麻煩。 我正在使用Design_Pictures表在Image和Design表之間使用has_many:through關系,該表將存儲設計圖像的訂單排名。 所有圖像都與一個用戶關聯。 稍后,我希望可以靈活地在“圖像”表中存儲與特定設計無關的其他圖像。

我可以成功地將樣本數據添加到數據庫中,並在我的顯示設計頁面中顯示圖像標題(存儲在圖像表中)和排名(存儲在design_pictures表中)。 我不知道如何創建一個新的design_picture。 一旦可以正常工作,我將使用CarrierWave或Paperclip將圖像添加到Image表中。

這是我的模型:

app / models / image.rb:

class Image < ActiveRecord::Base
  attr_accessible :title
  belongs_to :user
  has_many :design_pictures, dependent: :destroy 
  has_many :designs, :through => :design_pictures

  validates :user_id, presence: true
  validates :title, length: { maximum: 80 }
end

app / models / design.rb:

class Design < ActiveRecord::Base
  attr_accessible :title
  has_many :design_pictures, dependent: :destroy 
  has_many :images, :through => :design_pictures

  validates :title, presence: true, length: { maximum: 60 }
end

app / models / design_picture.rb:

class DesignPicture < ActiveRecord::Base
  attr_accessible :ranking
  belongs_to :image
  belongs_to :design

  validates :image_id, presence: true
  validates :design_id, presence: true   

  default_scope order: 'design_pictures.ranking ASC'
end

app / models / user.rb:

class User < ActiveRecord::Base
  attr_accessible :name
  has_many :designs, dependent: :destroy 
  has_many :images, dependent: :destroy

  validates :name, presence: true, length: { maximum: 50 }
end

觀看次數:

app / views / designs / show.html.erb:

            <div>
                <% if @design.design_pictures.any? %>
                    <h3>Images (<%= @design.design_pictures.count %>)</h3>
                    <ul>
                        <%= render @design_pictures %>
                    </ul>
                <% end %>
            </div>

            <div>
                <%= render 'shared/design_picture_form' %>
            </div>

app / views / design_pictures / _design_picture.html.erb

<li>
    <%= design_picture.image.title %> - Ranking: <%= design_picture.ranking %>
</li>

app / views / shared / _design_picture_form.html.erb:

<%= form_for(@design_picture) do |f| %>
    <%= render 'shared/error_messages', object: f.object %>

    <%= f.label :title, "Title" %>
    <%= f.text_field :title, 
                placeholder: "Name your image.",
                class: "" %>

    <%= f.label :ranking, "Ranking" %>
    <%= f.text_field :ranking, 
            placeholder: "Rank your design picture.",
            class: "" %>            

    <%= hidden_field_tag(:design_id, @design.id) %>

    <%= f.submit "Add Image", class: "btn btn-large btn-primary" %>
<% end %>

控制器:

app / controllers / designs_controller.rb

    def show
        @design = Design.find(params[:id])
        @design_pictures = @design.design_pictures.find(:all, :limit => 10)

        @image = current_user.images.build 
        @design_picture = @design.design_pictures.build
    end

app / controllers / design_pictures_controller.rb

    def create
        @current_design = Design.find(params[:design_id])
        @image = current_user.images.new(params[:title])
        @design_picture = @current_design.design_pictures.build(:image_id => @image.id, params[:ranking])

        if @design_picture.save
            flash[:success] = "Micropost created!"
            redirect_to @current_design
        else
            redirect_to designs_url
        end
    end

當我訪問design_picture表單部分時出錯:

undefined method `title' for #<DesignPicture image_id: nil, design_id: 1427, ranking: nil>

如果我從表單中刪除標題,則可以提交表單,但不會創建任何內容。

任何幫助將不勝感激。

您的DesignPicture沒有title屬性。 當您這樣做時:

@design.design_pictures.build

它構建一個新的DesignPicture實例。 並且以下不起作用:

<%= form_for(@design_picture) do |f| %>
  # ...

  <%= f.label :title, "Title" %>

  # ...

您可能想看一下嵌套表格

我不確定這是否是解決此問題的最佳方法,但這就是我能夠使表單提交並創建帶有title屬性的Image條目和帶有rank屬性的Design_Picture條目的方式。 我最終不需要使用accepts_nested_attributes_for。

app / views / shared / _design_picture_form.html.erb

<%= form_for(@design_picture) do |f| %>
<%= render 'shared/error_messages', object: f.object %>

<%= label_tag(:title, "Title") %>
<%= text_field_tag(:title) %>   

<%= f.label :ranking, "Ranking" %>
<%= f.text_field :ranking, 
        placeholder: "Rank your design picture.",
        class: "" %>            

<%= hidden_field_tag(:design_id, @design.id) %>

<%= f.submit "Add Image", class: "btn btn-large btn-primary" %>

app / controllers / designs_controller.rb

def show
    @design = Design.find(params[:id])
    @design_pictures = @design.design_pictures.find(:all, :limit => 10)

    @design_picture = @design.design_pictures.build
end

app / controllers / design_pictures_controller.rb

def create
    @image = current_user.images.create(:title => params[:title])
    @current_design = Design.find(params[:design_id])       
    @design_picture = @current_design.design_pictures.build(params[:design_picture])
    @design_picture.image_id = @image.id

    if @design_picture.save
        flash[:success] = "Design Picture created!"
        redirect_to @current_design
    else
        redirect_to designs_url
    end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM