Rails 3 - Как создать новую запись из link_to - PullRequest
8 голосов
/ 28 августа 2011

Я пытаюсь создать функциональность «тега», которая позволяет пользователю «маркировать» элементы, которые ему интересны. Вот моя модель

class tag
  belongs_to :user
  belongs_to :item
end

Соответствующая таблица БД имеет обязательные поля :user_id и :item_id.

В списке :items я хочу ссылку рядом с каждым :item, которая позволяет пользователю пометить :item. Поскольку я знаю :user_id и :item_id, я хочу создать новую запись :tag, установить поля идентификатора и сохранить запись - и все это без вмешательства пользователя. Я попытался выполнить следующий вызов link_to, но в базе данных не было сохранено ни одной записи:

<%= link_to 'Tag it!', {:controller => "tracks", 
                       :method => :post, 
                       :action => "create"},
                       :user_id => current_user.id, 
                       :item_id => item.id %>

(Этот код находится внутри оператора: @item.each do |item|, поэтому item.id действителен.)

Этот link_to вызов создает этот URL:

http://localhost:3000/tags?method=post&tag_id=7&user_id=1

Который не создает запись Tag в базе данных. Вот мое :create действие в tags_controller

 def create
    @tag = Tag.new
    @tag.user_id = params[:user_id]
    @tag.tag_id = params[:tag_id]
    @tag.save
  end

Как мне получить link_to для создания и сохранения новой записи тега?

1 Ответ

14 голосов
/ 28 августа 2011

Тот факт, что сгенерированный URL имеет метод в качестве параметра, подразумевает, что он выполняет GET, а не POST.

Подпись link_to, которую вы должны использовать, - link_to(body, url_options = {}, html_options = {})

<%= link_to 'Tag it!', {:controller => "item", 
                       :action => "create", 
                       :user_id => current_user.id, 
                       :item_id => item.id},
                       :method => "post" %>

:метод должен быть передан html_options, а остальные - url_options.Это должно работать.

...