【问题标题】:Path defined in controller and action is getting ignored, Ruby on Rails控制器中定义的路径和动作被忽略,Ruby on Rails
【发布时间】:2012-04-13 01:39:40
【问题描述】:

根据http://guides.rubyonrails.org/layouts_and_rendering.html

我应该能够定义来自不同控制器的路径,就像我在 micropostscontroller 中的创建操作中所做的那样:

def create
      @micropost = current_user.microposts.build(params[:micropost])
      if @micropost.save
        flash[:success] = "Micropost created!"
        redirect_to profile_path
      else
        render 'static_pages/profile'
      end
    end

但是,当我未能成功创建帖子时(将其留空或使其过长),页面“/microposts”被渲染,控制器的主页不存在。当我成功创建微博时,我被重定向到配置文件路径“/profile”,当我将render 'static_pages/profile' 更改为redirect_to profile_path 时,重定向工作。为什么浏览器会忽略渲染请求并转到 microposts 控制器主页?

此外,渲染的微博页面会出现 NoMethodError:

NoMethodError in Microposts#create

undefined method `name' for nil:NilClass

<% provide(:title, @user.name) %>

app/views/static_pages/profile.html.erb:16:in `_app_views_static_pages_profile_html_erb___1610169404003779010_70327969935820'
app/controllers/microposts_controller.rb:10:in `create'

配置文件在重定向到时会自行呈现,因为@user 是在 static_pages 控制器的配置文件操作中定义的。 @user = User.find_by_remember_token(cookies[:remember_token])

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 redirect path render


    【解决方案1】:

    您的 create 方法正在尝试渲染“app/views/static_pages/profile.html.erb”,但您没有给它一个@user 来渲染。如果您以这种方式修改代码,它应该可以工作:

    def create
      @micropost = current_user.microposts.build(params[:micropost])
      if @micropost.save
        flash[:success] = "Micropost created!"
        redirect_to profile_path
      else
        @user = current_user # Add this line!
        render 'static_pages/profile'
      end
    end
    

    请注意microposts#create 方法的路径是/microposts,因此除非您使用redirect_to 而不是render,否则它仍会显示在您的地址栏中。

    【讨论】:

    • 为什么不只是@user = current_user
    • 已编辑以反映您的建议!我只是借用了他提到的在他的 static_pages 控制器中使用的 sn-p。
    • 由于某种原因,我仍然无法显示错误消息,我希望我认为我需要渲染,但似乎渲染不是解决方案。
    【解决方案2】:

    我想你误解了render 的作用。它只是改变渲染的模板。它不会导致控制器中与模板(如果有的话)相关的任何代码被执行。

    堆栈跟踪显示它正在呈现您请求的文件,尽管它似乎希望定义 @user,而您似乎在创建操作中没有这样做。将@user 设置为current_user 就可以了。

    重定向可能是一个更好的选择——如果用户刷新页面,它可能会重新提交表单数据,而重定向则不会发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多