Я не уверен, но ... Я думаю, что Rails 3 использует другой подход, чем ответ @ FRKT.Если вы создаете link_to 'whatever', new_somethings_path, :method => :post
, он просто добавляет несколько полей HTML 5:
<a href="/somethings" data-method="post" rel="nofollow">whatever</a>
и использует js для создания формы и ее отправки.Вот некоторый код js из rails.js
:
function handleMethod(element) {
var method = element.readAttribute('data-method'),
url = element.readAttribute('href'),
csrf_param = $$('meta[name=csrf-param]')[0],
csrf_token = $$('meta[name=csrf-token]')[0];
var form = new Element('form', { method: "POST", action: url, style: "display: none;" });
element.parentNode.insert(form);
if (method !== 'post') {
var field = new Element('input', { type: 'hidden', name: '_method', value: method });
form.insert(field);
}
if (csrf_param) {
var param = csrf_param.readAttribute('content'),
token = csrf_token.readAttribute('content'),
field = new Element('input', { type: 'hidden', name: param, value: token });
form.insert(field);
}
form.submit();
}
Так что я думаю, что _method
в параметрах не будет работать.
Так что вы можете сделать?
В действии index
просто добавьте проверку некоторых параметров:
def index
if params[:title]
@post = Post.new :title => params[:title], :body => params[:body]
if @post.save
... # successful save
else
... # validation error
end
end
... # put normal index code here
end
Вы можете поместить все объекты создания и сохранения в другой метод, чтобы ваш контроллер индекса мог выглядеть чище.
Вы также можете создать собственный маршрут для этой цели и пользовательское действие:
# routes
match 'bookmarklet' => 'posts#bookmarklet'
Затем поместите приведенный выше код из действия index
в действие bookmarklet
в контроллере сообщений.