0

私のアプリは 4 つのモデルで構成されています。ユーザー > リスト > ウィッシュ < アイテム。私はフロントページにすべてのアイテムを表示していますが、個々のアイテムから願い事を構築できるようにしたいと考えています.

関連付けのため、ユーザーがアイテムを関連付けるリストを指定できるようにする必要があります。ajax呼び出しとモーダルでやりたい。itemただし、パーシャル内のインスタンス変数は、リストを指定するフォームをレンダリングするを呼び出す_item.html.erbを介して渡すことはできません。link_toapp/views/wishes/new.js.erb

私は Rails と Ruby の初心者で、この問題に何日も悩まされていました。したがって、どんな助けも大歓迎です。

協会:

class User < ActiveRecord::Base
  has_many :lists, dependent: :destroy
  has_many :wishes, through: :lists
  has_many :items, through: :wishes
end

class List < ActiveRecord::Base
  belongs_to :user
  has_many :wishes, dependent: :destroy
  has_many :items, through: :wishes
end

class Wish < ActiveRecord::Base
  belongs_to :list, touch: true
  belongs_to :item
end

class Item < ActiveRecord::Base
  has_many :wishes
  has_many :lists, through: :wishes
end

アプリ/ビュー/static_pages/home.html.erb

<%= render @items %>

アプリ/ビュー/アイテム/_item.html.erb

<div class="span4">
    <div class="white-box item">
        <div class="image-container">
            <%= link_to "Wishlistt it", new_wish_path(item_id: item.id), id: "new_wish", class: "btn btn-primary btn-large", remote: true %>
            <a href="<%= item_path(item) %>" class="item-link">
                <em class="mark"></em>
                <%= image_tag item.image_url(:medium).to_s %>
            </a>
        </div>
        <h3><%= item.title %></h3>
        <%= item.wishes.count %> wishes this item

    </div>
</div>

アプリ/ビュー/願い/new.js.erb

$('body').append('<%= j render "new_wish" %>');
$('#new_wish').modal('toggle')

アプリ/ビュー/ウィッシュ/_new_wish.html.erb

<div id="new_wish" class="modal hide fade" tabindex="1" role="dialog" aria-labelledby="make_wish" aria-hidden="true">
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
    <h3 id="wishlistt_it">Wishlistt it</h3>
  </div>
  <div id="linkpreview">
    <div class="modal-body">
      <%= form_for(@item.wishes.build(item_id: @item.id)) do |f| %>
        <%= f.hidden_field :item_id %>
        <%= f.label :list_id %>
        <%= select_tag :list_id, options_for_select(current_user.lists.all.collect{ |u| [u.name, u.id] }) %>
        <%= f.submit "Add wish", class: "btn btn-large btn-primary" %>
      <% end %>
    </div>
    <div class="modal-footer">
      <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
      <%= link_to "Get info", new_item_path, id: "urlb", class: "btn btn-primary", remote: true %>
    </div>
  </div>
</div>

からのリンクを押すと、_item.html.erb次のエラーが発生します。

undefined method `wishes&#x27; for nil:NilClass

編集

Wishes_controller.rb

class WishesController < ApplicationController
  before_filter :signed_in_user, only: [:create, :destroy]
  before_filter :correct_user,   only: :destroy

  def new
    @wish = Wish.new
  end

  def create
    @item = Item.find_by_id(params[:item_id])
    @wish = Wish.create!(item_id: params[:wish][:item_id], list_id: params[:list_id])
    redirect_to root_url
  end

  def destroy
    @wish.destroy
    redirect_to current_user
  end

  private

    def correct_user
      @wish = current_user.wishes.find_by_id(params[:id])
      redirect_to current_user if @wish.nil?
    end
end
4

1 に答える 1

0

まず、path_heplers の仕組みについて説明します。

new_wish_path

ルートを生成します

/wishes/new

wishes#newデフォルトでは、実際には持っていないメソッドを探します。

NewオブジェクトフォームをGETするにはアクションが必要で、createメソッドは入力されたデータをデータベースに保存します - これはデフォルトのRailsロジックです。

ここではフォームがありません。つまり、パスしませんparams[:wish](nil です)。

saveまた、create メソッドでは、入力データを DB に保存するメソッドを使用する必要があります。

結論として、私の意見では、このコードは、編集可能で正常に動作するものとはかけ離れています。とにかく、ここで提供されているヒントに従ってこのコードをリファクタリングすることをお勧めします。最初から、確実に時間を節約できます。

UPD

修正手順:

1) newWishes_contoller にメソッドを追加

2)フォームのインスタンスを定義@itemし、リクエストのパラメーターで見つけます:@item = Item.find_by_id(params[:item_id])

于 2013-06-09T10:05:24.273 に答える