【发布时间】:2016-10-21 19:16:05
【问题描述】:
我有一个 current_user 可以查看的个人资料页面,在该页面上会列出他们已回复的事件,并且在每个事件下方会有一个表格,如果他们愿意,可以将 RSVP 状态更新为不同的内容。这是他们可以从中选择的三种可能的 RSVP 状态的单选按钮(“参加”、“感兴趣”、“不感兴趣”)。我想让它在单击更新 RSVP 状态的单选按钮时不会重新加载页面。这是表单现在的样子。
<% current_user.past_events.each do |event| %>
<% rsvp_status = current_user.rsvp_for_event(event).status %>
<% unless rsvp_status == "not_interested" %>
<li><%= link_to event.title, event_path(event) %>
<%= form_for ([current_user, current_user.rsvp_for_event(event)]), remote: true, html: { class: "update" } do |f| %>
<%= f.hidden_field :event_id %>
<%= f.radio_button :status, "attending", :onclick => "this.form.submit();" %>
<%= f.radio_button :status, "interested", :onclick => "this.form.submit();"%>
<%= f.radio_button :status, "not_interested", :onclick => "this.form.submit();" %>
<% end %>
用户模型:
def rsvp_for_event(event)
Rsvp.where(:event_id => event.id).first
end
更新
1) 我得到的错误是ActionController::UnknownFormat in RsvpsController#update
2) 表单的 HTML 类似于 <form class="update" id="edit_rsvp_11" action="/users/1/rsvps/11" accept-charset="UTF-8" data-remote="true" method="post">,每个按钮的 HTML 类似于 <input onclick="this.form.submit();" type="radio" value="attending" name="rsvp[status]" id="rsvp_status_attending">。我在 ).on('click 部分引用什么 - update 表单类,radio 按钮类型等?这里有经验法则吗?
3) URL 包含两个任意参数,user_id 和 rsvp_id。如何在 AJAX 请求和 Rails 控制器的数据部分正确使用它们?
Rsvps控制器
def update
#is this part sufficient?
respond_to do |format|
format.html
format.js
end
end
views/rsvps/update.js.erb,assets/javascripts 中应该有另一个文件吗?
$(document).on('ready', function() {
//does the radio button reference go here?
$('.radio').on('click', function(e) {
e.preventDefault()
$.ajax({
type: 'POST',
url: "users/" + user_id + "/rsvps/" + rsvp_id,
data: {
user_id: "<%= current_user.id %>"
//in my view template, I added "<% rsvp_id = current_user.rspv_for_event(event)"
rsvp_id: "<%= rsvp_id %>"
}
}).done(function(response){ console.log('hello?', response)
})
})
})
【问题讨论】:
-
不在你的 js 中......那个 ruby 进入你的 html
<div class="some-class" data-user-id="<%= current_user.id %>">然后在你的 js 中......你通过说var user_id = $('.some-class').data('user-id')得到那个 id 把它放在阻止默认值之后并执行得到rsvp_id的同样的事情......不管那是什么......把它从页面上取下来。将这两个都传递给控制器动作。控制器操作的 url 应该是您添加到路由并在控制器中定义的新 url。不是演出路线。 -
更新了我的答案,部分显示给你。
标签: jquery ruby-on-rails ajax