Действие Simple_form_for указывает неверный URL-адрес при редактировании в рельсах

Я создал простую форму_For, общую как для нового, так и для обновления, в настоящее время он отлично работает для нового, но для редактирования/обновления он вызывает неправильный URL-адрес.

class NewsfeedsController < ApplicationController

    before_action :find_post, only: [:show, :destroy, :edit, :update]

    def index
        @posts = Post.all.order("created_at DESC")
    end

    def show
        # before_action is taking care of all 4 i.e(sho,edit,update and destroy)..Keeping it DRY
    end

    def new
        @post = Post.new
    end

    def create
        @post = Post.new(post_params)

        if @post.save
            redirect_to root_path
        else
            render 'new'
        end
    end

    def edit
    end

    def update
        if @post.update(post_params)
            redirect_to newsfeed_path(@post)
        else
            render 'edit'
        end
    end

    def destroy
    end

    private

    def post_params
        params.require(:post).permit(:content)
    end

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

    end

end

В форме.html

<%= simple_form_for @post, url: newsfeeds_path(@post) do |f| %>
  <%= f.input :content,label: false, placeholder: "write your post here..." %>
  <%= f.button :submit %>
<% end %>

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

это должно быть action="/newsfeeds/7"

Пожалуйста, направляйте


person Anshul Riyal    schedule 05.01.2019    source источник
comment
Используете ли вы одну и ту же форму для обоих действий? В чем причина того, что вы не следуете соглашениям Rails и отправляете запросы в NewsfeedsController вместо PostsController?   -  person spickermann    schedule 05.01.2019
comment
я сказал не следовать соглашению о рельсах, и поэтому это усложняет form_for. У меня нет постконтроллера.   -  person Anshul Riyal    schedule 05.01.2019
comment
здесь @post принимает идентификатор автоматически, или мы должны использовать @post.id   -  person Anshul Riyal    schedule 05.01.2019
comment
Если вы действительно хотите нарушить соглашения Rails (небольшой глупый совет, особенно когда в настоящее время нет PostsController), то вы должны убедиться, что форма использует разные URL-адреса для создания и метода обновления. Сначала POST newsfeeds_url, потом PATCH newsfeed_url(@post).   -  person spickermann    schedule 05.01.2019


Ответы (2)


Поскольку вы используете общую форму _form для нового и обновления, вам необходимо добавить условие в URL-адрес соответственно,

<%= simple_form_for @post, url:(@post.new_record? ? newsfeeds_path : newsfeed_path(@post)) do |f| %>

Это поможет вам использовать как новый метод, так и метод обновления. Надеюсь, это поможет.

person Anshul Riyal    schedule 05.01.2019

Действие обновления должно быть newsfeed_path(@post), а не newsfeeds_path(@post). Пожалуйста, исправьте это и повторите попытку!

<%= simple_form_for @post, url: newsfeed_path(@post) do |f| %>

Надеюсь, это поможет!

person Rajdeep Singh    schedule 05.01.2019