Rails redirect_to post метод?
redirect_to :controller=>'groups',:action=>'invite'
но я получил ошибку, потому что redirect_to посылает метод GET. Я хочу изменить этот метод на "POST", нет опции метода: redirect_to, что я буду делать? Могу ли я сделать это без redirect_to.
Edit:
У меня это в группах /invite.html.erb
<%= link_to "Send invite", group_members_path(:group_member=>{:user_id=>friendship.friend.id, :group_id=>@group.id,:sender_id=>current_user.id,:status=>"requested"}), :method => :post %>
Этот вызов вызова создает действие в контроллере group_members, и после создания действия я хочу показать groups/invite.html.erb с group_id (я имею в виду, после того, как будут созданы кнопки "Отправить приглашение", будут отображаться group_members, а затем текущая страница будет показано) следующим образом:
redirect_to :controller=>'groups',:action=>'invite',:group_id=>@group_member.group_id
После redirect_to запросить это с помощью метода GET, он вызывает действие show в группе и принимает приглашение как id и дает эту ошибку
Couldn't find Group with ID=invite
Мое приглашение в группе
def invite
@friendships = current_user.friendships.find(:all,:conditions=>"status='accepted'")
@requested_friendships=current_user.requested_friendships.find(:all,:conditions=>"status='accepted'")
@group=Group.find(params[:group_id])
end
Решение: мне нужно перенаправить это методом POST, но я не смог найти способ.
Уродливое решение: я решил эту проблему, которую я не предпочитаю. Я все еще жду, если у вас есть решение честно.
Мое решение добавляет маршрут для приглашения, чтобы избавиться от ошибки "Не удалось найти группу с идентификатором ID = приглашение".
в routes.rb
map.connect "/invite",:controller=>'groups',:action=>'invite'
в создании действия
redirect_to "/invite?group_id=#{@group_member.group_id}"
Я назову это решение на языке "amele yontemi" на английском языке "ручной рабочий метод" (я думаю).
Ответы
Ответ 1
Похоже, вы сработали, как работает маршрутизация Rails. Этот код:
redirect_to :controller=>'groups',:action=>'invite',:group_id=>@group_member.group_id
создает URL-адрес, который выглядит примерно как /groups/invite?group_id=1
.
Без отображения в вашем routes.rb
маршрутизатор Rails сопоставляет это с действием show
, а не invite
. Часть URL invite
сопоставляется с params[:id]
, и когда она пытается найти эту запись в базе данных, она терпит неудачу и вы получите сообщение, которое вы нашли.
Если вы используете маршруты RESTful, у вас уже есть строка map.resources
, которая выглядит так:
map.resources :groups
Вам нужно добавить настраиваемое действие для invite
:
map.resources :groups, :member => { :invite => :get }
Затем измените ссылку на params[:group_id]
в методе #invite
, чтобы использовать только params[:id]
.
Ответ 2
Ответ заключается в том, что вы не можете выполнять POST с помощью redirect_to
.
Это происходит из-за того, что redirect_to
просто отправляет HTTP-адрес переадресации HTTP 30x в браузер, который, в свою очередь, получает целевой URL, а браузеры делают только GET при переадресации
Ответ 3
Я нашел одноразовое решение, которое мне нужно было сделать в Rails 3. Я сделал маршрут, который вызовет метод в этом контроллере, который требует почтового вызова. Строка в "route.rb", например:
match '/create', :to => "content#create"
Вероятно, уродливые, но отчаянные времена требуют отчаянных мер. Просто подумал, что я поделюсь.
Ответ 4
Идея состоит в том, чтобы сделать "перенаправление", в то время как вы создаете форму с помощью метода: post.
Я столкнулся с той же проблемой и извлек решение в repost
gem, поэтому он делает всю работу за вас, поэтому не нужно создавать отдельное представление с формой, просто используйте предоставляемую функцией gem redirect_post()
на вашем контроллере,
class MyController < ActionController::Base
...
def some_action
redirect_post('url', params: {}, options: {})
end
...
end
Должен быть доступен на rubygems.