如何通过link_to传递实例变量,调用js文件,这会渲染部分?

时间:2013-06-09 09:27:17

标签: ruby-on-rails instance partial-views

我的应用程序包含四个模型。用户>列表>希望<项目。我正在首页上显示所有项目,并且希望能够根据各个项目构建愿望。

由于这些关联,我必须允许用户指定他想要与项目关联的列表。我想通过ajax调用和模态来完成。但是,item部分中的实例变量_item.html.erb无法通过link_to传递,app/views/wishes/new.js.erb会调用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 ,这会呈现一个表单以指定列表。

我对铁轨和红宝石很新,这个问题困扰了我好几天!因此,非常感谢任何帮助。

协会:

<%= render @items %>

应用程序/视图/ static_pages / home.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>

应用程序/视图/项目/ _item.html.erb

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

应用程序/视图/意愿/ new.js.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>

应用程序/视图/意愿/ _new_wish.html.erb

_item.html.erb

undefined method `wishes&#x27; for nil:NilClass 中的链接会引发此错误:

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

修改

wishes_controller.rb

{{1}}

1 个答案:

答案 0 :(得分:0)

首先,path_heplers如何运作。

new_wish_path

将产生路线

/wishes/new

默认情况下,它会查找您实际上没有的wishes#new方法。

GET对象表单需要

New操作,create方法保存数据库中的输入数据 - 这是默认的Rails逻辑。

这里没有表格,也就是说,你没有通过params[:wish](它是零)。

此外,在create方法中,您需要使用save方法,将输入的数据保存到数据库。

总而言之,在我看来,这段代码远远不够于可编辑且可正常工作的内容。无论如何,我建议按照此处提供的方式重构此代码,从非常开始,它将为您节省时间。

<强> UPD

修复步骤:

1)在wishes_contoller

中添加new方法

2)为表单定义实例@item,在请求中通过params找到它:@item = Item.find_by_id(params[:item_id])