Создание и обновление больше не работает.Какие-либо предложения?Или причины почему? - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь создать простое приложение типа блога для изучения ruby ​​на рельсах. Создать используется для работы, но после добавления функции редактирования / обновления, как создание, так и редактирование не работает. Я не уверен, что я сделал не так. Edit не обновляется с новыми данными, а Create больше не принимает новые данные. Пример: создание нового сообщения приведет к пустому сообщению, независимо от того, что написано, и при добавлении нового текста в старое сообщение не изменит сообщение после нажатия кнопки отправки.

Мой контроллер:

def create
    @post = Post.create(post_params)

    if @post.save(post_params)
      redirect_to @post
    else 
      render 'new'
    end
end

def show
    @post = Post.find(post_params[:id])
end

def update
    @post = Post.find(params[:id])
    if @post.update_attributes(post_params)
      redirect_to @post
    else
      render 'edit'
    end
end

def edit
    @post = Post.find(params[:id])
end

def post_params
    params.permit(:title, :detail)
end

Как редактировать, так и создавать HTML-файлы визуализируют страницу формы:

<div class="section">
    <%= simple_form_for @post do |f| %>
       <%= f.input :title %>
       <%= f.input :detail %>
       <%= f.button :submit %>
    <% end %>
</div>

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Вероятно, проблема в вашем post_params методе.Я предполагаю, что вам потребуется ключ :post, прежде чем разрешить его атрибуты.Обычно simple_form (и другие движки форм) собирает полезную нагрузку следующим образом:

{
  "utf8": "✓",
  "authenticity_token": "...",
  "commit": "Create Post",
  "post": {
    "title": "Opa",
    "content": "teste"
  }
}

, поэтому, если вы params.permit(:title, :detail, :id), вы получите пустой хеш.И это, вероятно, причина того, что сообщение сохраняется с пустыми атрибутами.

Вам нужно будет

params.require(:post).permit(:title, :detail)

по умолчанию, параметры URL (те, которые вы определяете в маршрутах, например /posts/:id) уже разрешены, поэтому вам не нужно ни разрешать, ни требовать.

0 голосов
/ 04 апреля 2019
def create
  @post = Post.new(post_params)  # use Post.new, don't create already
  if @post.save                  # if above Post is saved then redirect
    redirect_to @post 
  else 
    render 'new'
  end
end

def show
  @post = Post.find(params[:id])  #use params[:id], not post_params[:id]
end

def update
  @post = Post.find(params[:id])           #use params[:id] to find the post
  if @post.update_attributes(post_params)  #use post_params for attributes
    redirect_to @post
  else
    render 'edit'
  end
end

def edit
   @post = Post.find(params[:id])        #use params[:id] to find post
end

private

def post_params
  params.require(:post).permit(:title, :detail)
  # Don't permit the ID as you don't want to change the ID.
end
...