【问题标题】:How to render a form (Rails Simple_form) inside of a partial?如何在部分内部呈现表单(Rails Simple_form)?
【发布时间】:2019-11-20 04:58:15
【问题描述】:

以下是相关代码:

--- app/controllers/movies_controller.rb

    def show
        movie = convert_movie_data([Movie.find(params[:id])])
        @movie = movie[0]
        @movie_rating = movie[1]
        @comments = Comment.all

        if user_signed_in?
            @new_comment = new_movie_comment
        end
    end

在控制台,@cmets 返回

     #<Comment id: nil, title: nil, comment: nil, user_id: 21, movie_id: 10, created_at: nil, updated_at: nil>

--- app/views/movies/show.html.haml

 = render partial: 'shared/new', locales: { new_comment_form: @new_comment }

“= partial”处的部分在用户未登录时呈现。

这就是问题所在(我怀疑):

--- app/views/shared/_new.html.erb

<% if user_signed_in? %>
     <%= simple_form for new_comment_form:, method: :post, url: new_comment_path do |f| %>
        <%= f.input :title %>
        <%= f.input :comment %>
        <%= f.button :submit %>
    <% end %>
    You are signed in
<% else %>
    Please sign in to comment
<% end %>

我怀疑问题出在我为标签构建 simple_form 的方式上。

在控制器上,我注入了构建评论所需的值(current_user.id,movie_id),在显示视图中,我尝试通过语言环境(new_comment_form:)传输实例变量,但我确信我在构造简单表单时犯了一个错误。

我被告知我没有提供错误消息。感谢您指出@z3r0ss

SyntaxError at /movies/21

syntax error, unexpected ','
...ple_form_for new_comment_form:, method: :post, url: new_comm...
...                              ^
/app/views/shared/_new.html.erb:12: syntax error, unexpected keyword_ensure, expecting end-of-input
          ensure
          ^~~~~

我希望这会有所帮助,并再次感谢您的任何意见。

【问题讨论】:

    标签: ruby-on-rails simple-form


    【解决方案1】:

    首先,我会确保从MoviesController 发送Comment 的新实例

    def show
      @comment = Comment.new
    end
    

    对此的几点说明

    1 - 请记住,您通过 before_action 传递 @movie 实例(如果您在其他控制器方法中使用该实例,这将很有用)

    2 - 您可以使用 @movie.comments 从视图中访问属于该电影的所有 cmets(我假设那里存在关联!)

    关于表格,你可以试试这个:

    <%= simple_form_for [@movie, @comment] do |f| %>
      <%= f.input :title%>
      <%= f.input :comment%>
      <%= f.submit 'Post comment'%>
    <% end %>
    

    最后,在CommentsController,请记住重定向到您想要的任何地方。比如同一个@movie的节目

    [...]
    if @comment.save
      redirect_to @movie
    else
      render 'movies/show'
    end
    

    【讨论】:

    • 真的很感谢@Fesivajacquier 的帮助
    【解决方案2】:

    也许你可以更清楚地知道你有什么错误。从它的外观来看,它看起来像是一个语法错误。它应该是simple_form_for new_comment_form 而不是simple_form for new_comment_form:

    【讨论】:

    • 我注意到...我修复了错误。错误消息(我在上面发布)仍然没有变化。感谢您指出这一点:)
    • @wacevedo 你仍然有语法错误,这是: 之后的额外new_comment_form
    • 感谢 z3r0ss 的建议,尽管我完全不同。玩了一段时间后,我突然想到: 1. 我可以简单地将实例变量传递给部分...我不必用符号来引用它们。 :locals => [@movie, @comment] 第二:顺序很重要...它是基于电影 [@movie, @comment] 的评论,因此必须在表单定义中以相同的方式引用它们。下午请了假,大脑休息了一下,再看问题20分钟后才得出这个结论。
    猜你喜欢
    • 2016-06-08
    • 2011-09-27
    • 1970-01-01
    • 2016-01-27
    • 2014-04-09
    • 2014-01-13
    • 1970-01-01
    • 2022-10-13
    • 2014-12-23
    相关资源
    最近更新 更多