Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何正确地将ajax按钮上的路由设置为?_Jquery_Ruby On Rails_Ajax_Ruby On Rails 3 - Fatal编程技术网

Jquery 如何正确地将ajax按钮上的路由设置为?

Jquery 如何正确地将ajax按钮上的路由设置为?,jquery,ruby-on-rails,ajax,ruby-on-rails-3,Jquery,Ruby On Rails,Ajax,Ruby On Rails 3,我已经实现了一个基于ajax的按钮,用于从用户的“愿望列表”中添加和删除日历事件。该按钮的作用类似于切换开关。如果该事件已经在他们的愿望清单上,它将删除它;如果不是,那么它将添加它 我的问题是,当第一次加载页面时,按钮可以正常工作,但是在单击它并通过AJAX将其替换为新按钮后,它就不再工作了 我看了,但是他有一个稍微不同的架构,如果我可以避免的话,我还不打算完全重构它。对于保存的事件,我有一个单独的模型。这里有三个模型:用户、事件和保存的事件。用户和事件之间存在多对多关系,表示为已保存的_事件。

我已经实现了一个基于ajax的按钮,用于从用户的“愿望列表”中添加和删除日历事件。该按钮的作用类似于切换开关。如果该事件已经在他们的愿望清单上,它将删除它;如果不是,那么它将添加它

我的问题是,当第一次加载页面时,按钮可以正常工作,但是在单击它并通过AJAX将其替换为新按钮后,它就不再工作了

我看了,但是他有一个稍微不同的架构,如果我可以避免的话,我还不打算完全重构它。对于保存的事件,我有一个单独的模型。这里有三个模型:用户、事件和保存的事件。用户和事件之间存在多对多关系,表示为已保存的_事件。下面是模型中的相关代码

user.rb:

  has_many :saved_events
  has_many :events, :through => :saved_events
event.rb:

  has_many :saved_events
  has_many :watchers, :class_name => "User", :through => :saved_events, :source => :user
已保存的_event.rb:

  belongs_to :event
  belongs_to :user
我已经配置了相当标准的路由

routes.rb:

  resources :saved_events, :only => [:index,:create,:destroy]
  resources :users
  resources :events
我最初希望在事件的页面上看到此按钮,因此我将其添加到事件的show.html.erb中。(我意识到这还不是很干-我正在等待,直到它正确工作,将其移动到一个部分)

事件/show.html.erb:

  <% if !@is_watched %>
    <%= button_to "Add to Wishlist", { :action => 'create', :controller => 'saved_events', :id => @event.id }, :remote => true %>
  <% else %>
    <%= button_to "Remove from Wishlist", saved_event_path(@event), :remote => true, :method => 'delete' %>
  <% end %>
保存的\u事件\u控制器.rb:

  def show
    @event = Event.find(params[:id])
    @is_watched = @event.watchers.exists?(current_user) if !current_user.nil?

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @event }
      format.json { render :json => @event }
    end
  end
  def create
    logger.debug params.to_yaml

    @event = Event.find(params[:id])

    if !current_user.events.exists?(params[:id])
      current_user.events << @event
    end

    respond_to do |format|
      format.js
    end
  end

  def destroy
    logger.debug params.to_yaml

    @event = current_user.events.find(params[:id])
    current_user.events.delete(@event)

    respond_to do |format|
      format.js
    end
  end
这是我在日志中看到的,如果第二个按钮单击是“添加”


在页面初始加载时,“添加”按钮将“/saved_events?id=1”作为其操作,因此我不明白为什么在第二次单击按钮时会“/saved_events/1”。

问题似乎来自我的jquery。我需要将表单包装在一个div中,然后在该div上调用jquery.html(),而不是表单本身。我在控制器中进行了一些其他重构,为了简洁起见,我不会在这里发布这些重构,但以下是我的新js.erb文件:

create.js.erb:

$(".button_to").html("<%= escape_javascript button_to "Remove from Wishlist", saved_event_path(@event), :remote => true, :method => 'delete' %>");
<% button_html = button_to( 'Remove from Wishlist', { :action => 'destroy', :id => @saved_event.id }, :remote => true, :method => 'delete' ) %>
$("#toggle_wishlist").html("<%= escape_javascript( button_html ) %>");
'destroy',:id=>@saved_event.id},:remote=>true,:method=>'delete')%%>
$(“#toggle_wishlist”).html(“”);
destroy.js.erb:

$(".button_to").html("<%= escape_javascript (button_to "Add to Wishlist", { :action => 'create', :controller => 'saved_events', :id => @event.id }, :remote => true) %>");
$("#toggle_wishlist").html("<%= escape_javascript( button_to("Add to Wishlist", { :action => 'create', :controller => 'saved_events' }, :remote => true)) %>");
$("#toggle_wishlist .button_to").append("<%= escape_javascript( hidden_field_tag :event_id, @event.id ) %>");
$(“#toggle_wishlist”).html(“'create',:controller=>'saved_events'},:remote=>true))%>”;
$(“#切换#wishlist.按钮#to”).append(“”);
<% button_html = button_to( 'Remove from Wishlist', { :action => 'destroy', :id => @saved_event.id }, :remote => true, :method => 'delete' ) %>
$("#toggle_wishlist").html("<%= escape_javascript( button_html ) %>");
$("#toggle_wishlist").html("<%= escape_javascript( button_to("Add to Wishlist", { :action => 'create', :controller => 'saved_events' }, :remote => true)) %>");
$("#toggle_wishlist .button_to").append("<%= escape_javascript( hidden_field_tag :event_id, @event.id ) %>");