Вот как я это сделать:
#app/controllers/posts_controller.rb
class PostsController < ApplicationController
def index
@posts = Post.all
end
def new
@post = Post.new
end
def create
@post = Post.new post_params
respond_to do |format|
if @post.save #-> this is your code, I haven't changed it much
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render :show, status: :created }
else
format.html { render :new }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
private
def post_params
params.require(:post).permit(:name, :comment)
end
end
И передний конец:
#app/assets/javascripts/application.js
$(document).on("submit", "#new_post", function(e){
e.preventDefault();
$.ajax({
url: '/posts',
type: 'POST',
dataType: 'json',
data: {post: $(this).serialize()},
success: function(data) {
alert(data);
},
error: function(data) {
alert(data);
}
});
});
#app/views/posts/show.html.erb
Name <%= @post.name %>
Comment <%= @post.comment %>
Есть несколько проблем, с вашей реализации:
1 . Отправить
Ваша первая проблема заключается в том, что вы связываете запросы с кнопкой submit.
Несмотря на то, что это будет работать, верный способ сделать это - связать с отправить событие: $.on("submit"
.
Это означает, что вы должны привязать к форме , из которой вы сможете сопоставить введенные данные с помощью функции serialize
.
-
2. Данные
Во-вторых, вы устанавливаете свои собственные данные.
Несмотря на то, что проблема не является проблемой (синтаксис верен), он ничего не делает для вашего приложения. Вы в основном отправляете {name: 'value1', comment: 'value2'}
каждый раз.
Вы будете много лучше установить данные, используя данные из формы. Я сделал это в моем примере с помощью: {post: $(this).serialize()}
, который должен установить параметры следующим образом:
"post":
{
"name": [[name input]],
"comment": [[comment input]]
}
-
3. Ajax
Наконец, ты уверен вы хотите сделать это с помощью Ajax?
Ajax означает синхронного J avascript й X ML - это означает, что вы можете посылать запросы за пределами «нормальной» рамки для HTTP.
Хотя вы в пределах своей свободы, чтобы сделать это, я не вижу преимуществ этого в этом случае?
UJS
Лучший способ справиться с этой функции заключается в использовании Rails UJS (unobtrusive javascript) driver.
Это в основном связывается отформатированных JS для ваших HTML-элементов в зависимости от серии data
атрибутов добавляемых:
#app/views/posts/new.html.erb
<%= form_for @post, remote: true do |f| %>
<%= f.label :name %><br>
<%= f.text_field :name %>
<%= f.label :comment %><br>
<%= f.text_field :comment %>
<%= f.submit class: 'submit' %>
<% end %>
#app/assets/javascripts/application.js
$(document).on("ajax:success", "#new_post", function(data, status, xhr){
// success request
});
Вы можете увидеть больше о custom Rails UJS events здесь.
Комментарии
Но пост не происходит через AJAX.
Это будет связано с тем, что вы не отправляете правильные данные через свою систему.
Я обратился к этому в своем первом наборе кода - вам лучше всего ожидать функцию JS для события form#submit
и передачи сериализованных данных через ваш ajax.
Конечно, вам не нужно использовать Ajax в этом случае.
если данные хранятся, но не через ajax, вы просто отправляете форму, конечно? как выглядит ваша форма? вы должны сделать это ('submit') и вернуть false, если вы хотите использовать ajax '$ ('# formId'). on ('submit', function() {$ .ajax ({/ * ajax code * /}) ; return false;}); ' – futureweb
добавил мою форму. у моей кнопки отправки есть класс. – Ann
Вы не используете вывод JSON своего действия. Что вызывает вопрос: что именно вы пытаетесь достичь с помощью AJAX? –