1

ユーザー、投稿、書籍の 3 つのモデルがあり、4 番目の kms を介して関連付けられています。

  • ポストモデルには、スルーで多くのキロと本があります
  • 本のモデルには、多くの kms と投稿があります。
  • kmは本と郵便に属します

上記のケースでこのチュートリアルを試してみましたが、成功しました。

ここで、投稿を示す関連付けを作成したいと思います。

  • ユーザー has_many kms
  • Kmはユーザーに属します

協会:

class User < ActiveRecord::Base
  include Tenantable::Schema::Model
  has_many :kms, dependent: :destroy

  devise :database_authenticatable, :registerable,
  :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me


end

class Post < ActiveRecord::Base
  attr_accessible :name, :year, :author, :book_ids
  has_many :kms
  has_many :books, through: :kms   
end

class Book < ActiveRecord::Base
  attr_accessible :name
  has_many :kms
  has_many :posts, through: :kms
end

class Km < ActiveRecord::Base
  attr_accessible :count, :book_id, :post_id, :user_id
  belongs_to :book
  belongs_to :post
  belongs_to :user
end

PostsController での作成は次のようになります。

def create
  #this not working
  @post = current_user.build.kms(params[:post]) 
  @post.save
end

そして、次のようなビュー フォームを作成します。

<%= form_for @post, :url => create_post_subdomain_path(@post), :method => :post  do |f| %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :year, "Year" %><br />
    <%= f.text_field :year %>
  </div>
  <div class="field">
    <%= f.label :author, "Author" %><br />
    <%= f.text_field :author %>
  </div>
  <div class="field">
    <%= f.label "Book" %><br />
    <%= hidden_field_tag "post[book_ids][]", nil %>
     <% Book.all.each_with_index do |book, index| %>
         <%= label_tag dom_id(book) do %>
          <%= check_box_tag "post[book_ids][]", book.id, @post.book_ids.include?(book.id), id: dom_id(book) %> <%= book.nama %>
          <% end %>&nbsp;
         <%= '<br/><br/>'.html_safe if index == 3 %>
    <% end %>

  </div>
    <br/>
  <div class="actions">
    <%= f.submit ( "Save" ), :class => "btn btn-inverse btn-medium" %>&nbsp;&nbsp; or &nbsp;&nbsp;<%= link_to 'Cancel', list_book_subdomain_path, :class => "btn btn-medium btn-primary" %>
  </div>
<% end %>

を作成current_user.idするkm.user_idときにに生成しようとします。userpost

しかし、私はエラーが発生しました

Can't mass-assign protected attributes: name, year, author, book_ids

助言がありますか?

前もって感謝します

4

3 に答える 3

1

問題はおそらく PostsController の create アクションにあります。次のことを試してください。

def create
  @post = Post.create(params[:post])
  @km = current_user.kms.build(:post_id => @post.id)
  @km.save
end

あなたはまだ Km に book_id を設定する必要がありますが、あなたの投稿では can と書かれていますhas_many :books, :through => :kmsが、 Km belongs_to :book. それは意味がありません。book_idsポストで何をしていますか?

于 2013-04-11T12:25:07.830 に答える
0

解決済み

私は解決策、このような解決策を見つけました: whereのすべての列を@post作成して更新するため、出力は次のようになりますuser_idkm@post_id => @post.id

@post = Post.create(params[:post])
Km.where(:post_id => @post.id).update_all(:user_id => current_user.id)

出力

#<Km id: 1, post_id: 1, user_id: 1>,
#<Km id: 2, post_id: 1, user_id: 1>,
#<Km id: 3, post_id: 1, user_id: 1>,
于 2013-04-18T06:47:49.780 に答える
0

多分あなたがしたい

@post = Post.create(params[:post])
current_user.kms.create(post_id: @post.id) 

代わりは?

于 2013-04-11T12:21:44.333 に答える