【问题标题】:Better URLS clashing with my controller更好的 URLS 与我的控制器发生冲突
【发布时间】:2014-03-17 19:06:34
【问题描述】:

所以,我有一个允许用户创建和查找新事件的应用程序。我想美化 URL,我使用 this rails casts episode 作为参考。

问题出在控制器部分。我的事件控制器中有非常具体的代码,我希望他的建议不会造成任何问题。这是我当前的事件#show action:

 def show
    @event = Event.where(id: params[:id]).first
    if @event.present?
      @user = current_user
      # @event = Event.find(params[:id])
      @owner = @event.user
      @participants = @event.participants
      @waiting_participants = @event.waiting_participants
    else
      redirect_to events_path, error: 'Event not found'
    end
  end

Ryan 建议我将 find 行更改为:

def show
  @event = find_by_slug!(params[:id])
  ....the rest of my code here
end

如您所见,我发现事件略有不同:

def show
  @event = Event.where(id: params[:id]).first
  ....the rest of my code here
end

我怎样才能在不弄乱我的代码的情况下让他的工作方式?

干杯!

更新:

def update
     @event = current_user.events.find(params[:id])
    if @event.update_attributes(params[:event])
      @event.update_event_date
      flash[:success] = "Event updated."
      redirect_to @event
    else
      render 'edit'
    end
  end

【问题讨论】:

  • 您可以通过使用@vent = Event.find(params[:id]) 并允许异常完成其工作来大大简化您的操作。
  • 谢谢!是否愿意以答案形式对此进行扩展?干杯。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

您的显示视图应该永远只“显示”单个项目。你的代码:

@event = Event.where(id: params[:id]).first

...最好表达为:

@event = Event.find(params[:id])

您的原始代码返回一个包含单个对象的 ActiveRecord::Relation 对象(基本上是一个数组)。由于您正在查找具有 ID 的对象,该 ID 在创建记录时自动生成,因此 ID 将始终是唯一的。

如果您正确遵循 Ryan 的演员表,每条记录都会有一个与之关联的唯一 slug 名称。如果您正确遵循他的教程,您的代码应该没问题。

【讨论】:

  • 知道了 - 谢谢!更新了我原来的帖子。唯一有点令人困惑的是我的更新操作有 current_user.events.find(params[:id])。在我的节目中,破坏动作具有典型的 event.find(params[:id])。这会是一个问题吗?干杯。
  • 只要你到这些方法的路径没有改变,你应该没问题。总是很难用别人的应用程序来判断,但就像我一样做 - 打破它直到它停止打破:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 2013-09-05
  • 2020-09-15
  • 2016-07-27
  • 1970-01-01
相关资源
最近更新 更多