【问题标题】:Using Partial View's Controller Instead改用局部视图的控制器
【发布时间】:2017-07-19 02:29:25
【问题描述】:

我正在尝试使用部分视图的控制器而不是我渲染它的视图。我的情况如下;

我有用户,用户可以发布一些东西。这就是为什么我有两个控制器和模型(用户和帖子)。

在用户的页面中,有一个文本区域来获取内容的输入和按钮来发布。我已将此视图 .../views/posts/_new.html.erb 编写为局部视图,并在 .../ 中呈现此 partial views/users/index.html.erb 并使用部分视图,我使用了这段代码。

<%= render 'posts/new' %>

为了发帖,我写了这个方法;

posts_controller.rb

  def new
    @post = Post.new
  end

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

  def create
    @user = User.find(params[:user_id])
    @post = @user.posts.create(post_params)

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

.../views/posts/_new.html.erb

<%= form_for :post do |f| %>
          <%= f.text_area :content, :class => "form-control", "rows" => "5", "id" => "comment", "placeholder" => "Write something to share with your mates ..." %><br/>
          <%= button_tag  "Share", :class => "btn btn-primary pull-right" do %>
            <span class="glyphicon glyphicon-share-alt"></span>
          <% end %>
        <% end %>

这里的问题是,当我在局部视图中单击按钮时,它会转到设计控制器的 Users#RegistrationController。为什么?

Here,guide 告诉我们,如果局部视图和渲染它的视图之间存在关系,rails 会理解我们想要做什么,并改用局部视图的控制器。我在这里错过了什么吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 devise partial-views


    【解决方案1】:

    用你的表格更明确..,

    <%= form_for @post do |f| %>
    

    并将您的 user#index 控制器操作中的 @post 初始化为

    @post = Post.new 
    

    问题在于,在您当前的解决方案中,表单没有给出明确的 url 和方法,因此不知道您想用它创建帖子。

    【讨论】:

    • 现在似乎要纠正控制器,但在以下代码 @user = User.find(params[:user_id])PostsController#create 中给出了此错误 Couldn't find User with 'id'=
    • 但是,在 user#index 中进行 @post = Post.new 类型的初始化是不是错了?
    • 没错。您也可以只指定 url 和方法,但使用 @post 是可以的。对于 :user_id 您还需要使用表单传递参数...
    • 为什么没有获取到用户的id呢?
    • 好吧,你跳转到另一个控制器,默认情况下你的 user_id 不会被 rails 传递。您可以选择创建某事。就像 current_user 一样,它使 user_id 可以全局访问,或者您只需将 user_id 参数与提交表单一起传递。
    【解决方案2】:

    button_tag中添加:type =&gt; 'submit'

       <%= form_for :post do |f| %>
          <%= f.text_area :content, :class => "form-control", "rows" => "5", "id" => "comment", "placeholder" => "Write something to share with your mates ..." %><br/>
          <%= button_tag  "Share", :type => "submit", :class => "btn btn-primary pull-right" do %>
            <span class="glyphicon glyphicon-share-alt"></span>
          <% end %>
        <% end %>
    

    或者像这样把button_tag改成f.button

          <%= f.button :submit, :class => "btn btn-primary pull-right" do %>
            <span class="glyphicon glyphicon-share-alt"></span>
          <% end %>
    

    【讨论】:

      猜你喜欢
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2021-12-19
      • 2018-06-10
      相关资源
      最近更新 更多