ruby on rails 5.2 - не удалось обновить форму - PullRequest
0 голосов
/ 06 мая 2018

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

def create
  @message=Message.new(message_params)
  if @message.save
    redirect_to root_path
  else
    render 'new'
  end
end

def edit
    @message=Message.find(params[:id])
end

def update
    @message=Message.find(params[:id])
    if @message.update(message_params)
        redirect_to message_path(@message)
    else
        render 'edit'
    end
end

Я следовал за учебником каждый шаг, они могут это сделать, но я не могу. это всегда показывает:

 No route matches [POST] "/message/4/edit" 

Я не знаю, почему не удалось указать путь обновления? спасибо

маршруты:

resources :message

вид формы:

<h1>Edit</h1>
<%= form_for :message do |a| %>
<p>
<%= a.label :name %><br>
<%= a.text_field :name %>
</p>

<p>
 <%= a.label :description %><br>
 <%= a.text_area :description %>
</p>
<%=a.submit "update"%>
<% end %>

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Вы написали в комментарии: "В некотором учебнике сказано, что рельсы будут знать, когда использовать сообщение или патч, нажав ту же кнопку отправки. Они сказали, что если рельсы не могут найти запись в модели, он будет использовать" пост "для создания; но когда он найдет старую запись в модели, он будет использовать «patch или put» для автоматического обновления.

И это правильно.

Но Rails нужно кое-что знать, какую запись обновлять (например, id записи). У вас есть <%= form_for :message do |a| %> в форме. Здесь нет информации о том, какую запись обновить. Должно быть

<%= form_for @message do |a| %>

Примечание @ - это переменная экземпляра из действия редактирования контроллера @message = Message.find(params[:id]), и это конкретное сообщение с идентификатором.

Если вы используете его, вы можете написать только одну форму для действий создания и обновления, она будет работать автоматически - просто получите @message из действия new / edit.

Подробнее об этом можно прочитать в руководствах

0 голосов
/ 07 мая 2018

Я решил это с помощью длинного стиля, но короткий стиль все еще не работает, я понятия не имею. В любом случае, спасибо вам, ребята.

## Creating a new article
# long-style:
form_for(@article, url: articles_path)
# same thing, short-style (record identification gets used):
form_for(@article)

## Editing an existing article
# long-style:
form_for(@article, url: article_path(@article), html: {method: 
"patch"})
# short-style:
form_for(@article)
0 голосов
/ 06 мая 2018

Я думаю, что с вашей формой что-то не так с вашей точки зрения.

Если вы посмотрите на то, что создано resources :messages в routes.rb:

enter image description here

Вы можете видеть, что действие контроллера update не должно быть методом POST - это должно быть PATCH или PUT.

Я бы порекомендовал прочитать эту замечательную статью. Маршрутизация с внешней стороны. - когда вы закончите с этим, держу пари, вы сможете выяснить, что не так с вашей формой.

Удачи

...