Как использовать URL-адрес для ссылки на действие создания в Ruby on Rails? - PullRequest
0 голосов
/ 26 сентября 2010

Я пытаюсь использовать следующий URL для создания объекта из букмарклета:

http://localhost:3000/posts?title=Welcome&body=To

но это приводит меня к действию index. Как мне заставить его указать на действие создания? Я знаю, что и index, и create используют один и тот же URL, используя GET и POST соответственно, но я не уверен, как указать, какой из URL использовать. Спасибо за чтение.

1 Ответ

1 голос
/ 26 сентября 2010

Я не уверен, но ... Я думаю, что 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 в контроллере сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...