【问题标题】:Redirect to show in another controller (Rails)重定向以在另一个控制器中显示(Rails)
【发布时间】:2014-03-28 23:05:02
【问题描述】:

我有一个表单,允许用户在组 Show 方法中发布。发布后,我想重定向到显示新帖子的同一页面。我正在使用以下内容,但出现以下错误。我不确定为什么@group 是 nil,因为我已经在我的组控制器的显示中定义了它。

没有路由匹配 {:id=>nil} 缺少必需的键:[:id] 为了 重定向到组路径(@group)

<%=form_for([@post]) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
    <div class = "field">
      <%= f.label :event_name %>
      <%= f.collection_select(:event_id, @events, :id, :title) %>
    </div>
    <div class = "field">
      <%= f.text_area :comment, placeholder: "New Post..." %>
    </div>
      <%= f.hidden_field :user_id, value: current_user.id %>
    <%=f.submit "Submit", class: "btn btn-large btn-primary" %>
<%end%>


class PostsController < ApplicationController

  def create
    if @post = Post.create(post_params)
      flash[:success] = "Post Created!"
      redirect_to group_path(@group)
    else
      redirect_to group_url
      flash[:alert] = "Sorry - Post not created."
    end
  end
end


  def show
    @event = @group.events.build
    @post = Post.new
    @events = @group.events.includes(:posts)
    @group = Group.find(params[:id])
  end

【问题讨论】:

    标签: ruby-on-rails redirect


    【解决方案1】:

    在您的创建操作中,您尝试使用@group 实例变量。您尚未在 create 操作中定义它,因此如果您想使用它,您需要在那里创建它。由于 create 调用在单独的请求周期中,因此您在 show 操作中定义的实例变量不可用。

    更新: 如果你有一个 event_id 和 event belongs_to :group 你可以这样做:

    event = Event.find(event_id)
    @group = event.group
    

    【讨论】:

    • 我如何找到@group...我的表单仅传递 event_id,而不是 group_id。我的应用程序中有一个组有_many 事件。
    • 如果事件有belongs_to :group 那么你可以从事件中获取组。
    【解决方案2】:

    create 操作中设置@group。您没有为 @group 分配任何值,这就是您收到错误的原因。

    编辑

    根据您的评论A Group has_many events,您可以找到如下群组:

    @group = Event.find(params[:event_id]).group
    

    【讨论】:

    • 谢谢 - 我也尝试过这样做,就像这样,但没有骰子:@group = Group.find(params[:event_id])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    相关资源
    最近更新 更多